1) на экранной форме создать перед «Черт N – Наименование» ещё одно поле ввода «Номер карточки складского учёта» (№ карт.) состоящее из 4 чисел (например «0001»), которое также будет сохраняться в таблицу OSGP.dbf, в первое поле под названием NKART.
Это поле тоже вставить в сетку, да, т.е. № карт. будет для каждой строки?
поиск производится по всей таблице
на одном номере карточки могут быть разные кладовщики
поиск по наименованию сейчас сделан по полному имени или сделать по фрагменту
поиск по наименованию сейчас сделан по полному имени или сделать по фрагменту
сделайте пожалуйста по фрагменту
Вот, что я сейчас подумал, а как мы тогда узнаем какая запись принадлежит какому кладовщику, ведь результат поиска может принадлежать разным кладовщикам. Тогда в запрос нужно вводить ещё и номер кладовщика и дополнить форму кнопкой поиск.
Может я чего то не понял, но мы же ищем в "Поиске по: № карт. и Черт - N - наименование" только те записи, которые соответствуют выбранному номеру кладовщика, а не записи по всей таблице, т.е. если не выбран номер кладовщика мы не можем производить поиск по № карт. и Черт - N - наименование. Желательно при попытке всё же это сделать чтобы выводилось сообшение "Выбирете сначала кладовщика".
при выборе Кладовщика, из таблицы OSGP.dbf выводились бы записи, по полям NKART – № карт. и NCHTO – Черт N – Наименование, соответствующие выбранному кладовщику. По ним же обеспечить возможность поиска.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, Grids, DB, DBTables;
type
TForm1 = class(TForm)
Table1: TTable;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Button1: TButton;
MaskEdit1: TMaskEdit;
Query1: TQuery;
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
Button2: TButton;
Label8: TLabel;
MaskEdit2: TMaskEdit;
Button3: TButton;
DataSource1: TDataSource;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1Exit(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure MaskEdit2Exit(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
function CreateTable(TabName, TabStruct, TabIDX: string): boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
FileNames: String;
implementation
uses Unit2, Unit3;
{$R *.dfm}
const
CreateTab = 'CREATE TABLE ';
IDXTab = 'PRIMARY KEY ';
MyTabStruct =
'NKART CHARACTER(4), ' +
'DOST DATE, ' +
'CHTO CHARACTER(18), ' +
'NCHTO CHARACTER(50), ' +
'OCN DECIMAL(12,2), ' +
'VES DECIMAL(10,3), ' +
'NKL CHARACTER(1), ' +
'NSKL CHARACTER(2), ' +
'EI CHARACTER(2), ' +
'CI CHARACTER(2), ' +
'OST DECIMAL(5), ' +
'KZK CHARACTER(6) ';
function TForm1.CreateTable(TabName, TabStruct, TabIDX: string): boolean; // Создаём новую таблицу
begin
result := true;
with Query1 do // Для query делаем
try
try
SQL.Clear; // Отчистили запрос
SQL.Add(CreateTab + TabName + '(' + TabStruct + TabIDX + ')'); // Добавили новый запрос
Prepare; // Оптимизация выполнения запроса
ExecSQL; // Выполняем запрос
except
// Обработка ошибок открытия таблицы
Exception.Create('Ошибка открытия таблицы'); // Генерация исключения
result := false;
end;
finally
Close; // Закрыть запрос
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
{Перебросим выбранное в значение из ComboBox в grid}
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible:= False; // Спрятали комбобокс
StringGrid1.SetFocus; // Фокус на сетку
end;
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
{Перебросим выбранное в значение из ComboBox в grid}
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible:= False; // Спрятали комбобокс
StringGrid1.SetFocus; // Фокус на сетку
end;
procedure TForm1.FormCreate(Sender: TObject);
var
row: integer;
begin
MaskEdit1.Text:= (DateToStr(Now)); // Присвоили полю ввода текущую дату
ComboBox1.Visible:= False; // Спрятать combobox
MaskEdit2.Visible:= false; // Спрятать maskedit
{Высоту combobox'а не изменишь, так что вместо combobox'а
будем изменять высоту строки grid'а !}
StringGrid1.DefaultRowHeight:= ComboBox1.Height;
{Table1.TableName:= ExtractFilePath(ParamStr(0))+'KACZCH.DBF'; }// Добавление имя базы
FileNames:= #39 + ExtractFilePath(ParamStr(0)) + 'KACZCH.DBF' + #39; // Получили строку с именем файла исходной таблицы
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + FileNames); // Добавили новый запрос
Query1.Open; // Открыли запрос
Query1.first; // Перешли на первую строку запроса
// Выставляем нужную ширину колонок сетки
StringGrid1.colWidths[0]:= 60;
StringGrid1.colWidths[1]:= StringGrid1.Width - 395;
StringGrid1.colWidths[2]:= 60;
StringGrid1.colWidths[3]:= 64;
StringGrid1.colWidths[4]:= 64;
StringGrid1.colWidths[5]:= 119;
//
row:= 0;
StringGrid1.rowcount:= Query1.recordCount; // Уравняли количество строк в сетке с количеством записей в запросе
while not Query1.eof do // Пока не достигнут конец запроса делаем
begin
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO']; // Добавляем данные в сетку
StringGrid1.cells[2,row]:= {Query1.FieldValues['EI']}'шт';
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
inc(row); // Увеличили на 1
Query1.next; // Переход на следующую запись
end;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
var
row: integer;
begin
if key = #13 then // Делаем поиск по нажатию enter
begin
// выполнить поиск
Query1.Close; // Закрыли запрос // |
Query1.SQL.Clear; // ' LIKE "%'+Edit2.Text+'%"' - ищет фрагмент текста
Query1.SQL.Add('Select * from ' + FileNames + ' where NCHTO LIKE "%'+Edit2.Text+'%"');
Query1.Open; // Окрыли запрос
if Query1.RecordCount <> 0 then // Если количество записей не равно 0 вставляем данные в сетку
begin
row:= 0;
StringGrid1.rowcount:= Query1.recordCount;
while not Query1.eof do
begin
StringGrid1.cells[0,row]:= '';
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO'];
StringGrid1.cells[2,row]:= 'шт';
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
StringGrid1.cells[4,row]:= '';
StringGrid1.cells[5,row]:= '';
inc(row);
Query1.next;
end;
end
else // Иначе делаем запрос с текстом из заглавных букв
begin
Query1.Close; // |
Query1.SQL.Clear; // ' LIKE "%'+Edit2.Text+'%"' - ищет фрагмент текста
Query1.SQL.Add('Select * from ' + FileNames + ' where NCHTO LIKE "%'+AnsiUpperCase(Edit2.Text)+'%"');
Query1.Open;
if Query1.RecordCount <> 0 then // Если количество записей не равно 0 вставляем данные в сетку
begin
row:= 0;
StringGrid1.rowcount:= Query1.recordCount;
while not Query1.eof do
begin
StringGrid1.cells[0,row]:= '';
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO'];
StringGrid1.cells[2,row]:= 'шт';
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
StringGrid1.cells[4,row]:= '';
StringGrid1.cells[5,row]:= '';
inc(row);
Query1.next;
end;
end
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: string;
begin
if not FileExists(ExtractFilePath(ParamStr(0))+'OSGP.DBF') then // Если таблицы не существует
CreateTable('"OSGP.DBF"', MyTabStruct, ''); // Создаём её
Table1.TableName:= ExtractFilePath(ParamStr(0))+'OSGP.DBF'; // Добавление имя базы
Table1.Active:= true; // Открыли таблицу
for i:= 0 to StringGrid1.RowCount - 1 do // Проходим все строки сетки
if (StringGrid1.Cells[4, i] <> '') or (StringGrid1.Cells[5, i] <> '') then // Если ввели число в ячейку
begin
s:= #39 + StringGrid1.Cells[1, i] + #39; // Получаем строку для запроса обрамлённую апострофами
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + FileNames + ' where NCHTO = '+s+''); // Добавили запрос
Query1.Open; // Открыли запрос
if Table1.Locate('NCHTO', StringGrid1.Cells[1, i], [loPartialKey]) then // Нашли в таблице нужную запись
begin // Такие данные уже есть
if ((Table1.FieldValues['DOST'] = MaskEdit1.Text) and (Table1.FieldValues['NKL'] = StringGrid1.Cells[5, i]) and (Table1.FieldValues['OST'] = StringGrid1.Cells[4, i])) then
ShowMessage('Введенные данные для записи ' + StringGrid1.Cells[1, i] + ' имеются в базе OSGP.dbf')
else
begin // Меняем данные в записи
Table1.Edit; // Ставим запись на редлактирование
Table1.FieldValues['NKART']:= StringGrid1.Cells[0, i];
Table1.FieldValues['DOST']:= MaskEdit1.Text; // Записываем новые данные
Table1.FieldValues['CHTO']:= Query1.FieldValues['CHTO'];
Table1.FieldValues['NCHTO']:= Query1.FieldValues['NCHTO'];
Table1.FieldValues['OCN']:= Query1.FieldValues['OCN'];
Table1.FieldValues['VES']:= Query1.FieldValues['VES'];
Table1.FieldValues['EI']:= Query1.FieldValues['EI'];
Table1.FieldValues['NKL']:= StringGrid1.Cells[5, i];
Table1.FieldValues['NSKL']:= '72';
Table1.FieldValues['OST']:= StringGrid1.Cells[4, i];
Table1.FieldValues['CI']:= Query1.FieldValues['CI'];
Table1.FieldValues['KZK']:= Query1.FieldValues['KZK'];
Table1.Post; // Сохранили изменения
end;
end
else // Нужную запись не нашли
begin
Table1.Insert; // Вставили новую запись в таблицу
Table1.FieldValues['NKART']:= StringGrid1.Cells[0, i];
Table1.FieldValues['DOST']:= MaskEdit1.Text; // Записываем новые данные
Table1.FieldValues['CHTO']:= Query1.FieldValues['CHTO'];
Table1.FieldValues['NCHTO']:= Query1.FieldValues['NCHTO'];
Table1.FieldValues['OCN']:= Query1.FieldValues['OCN'];
Table1.FieldValues['VES']:= Query1.FieldValues['VES'];
Table1.FieldValues['EI']:= Query1.FieldValues['EI'];
Table1.FieldValues['NKL']:= StringGrid1.Cells[5, i];
Table1.FieldValues['NSKL']:= '72';
Table1.FieldValues['OST']:= StringGrid1.Cells[4, i];
Table1.FieldValues['CI']:= Query1.FieldValues['CI'];
Table1.FieldValues['KZK']:= Query1.FieldValues['KZK'];
Table1.Post; // Сохранили таблицу
end;
//
end;
Table1.Active:= false; // Закрыли таблицу
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
R: TRect;
begin
if (ACol = 0) or (ACol = 4) or (ACol = 5) then // Редактируем только 3 и 4 ячейки
StringGrid1.Options := StringGrid1.Options + [goEditing] // Разрешаем редактировать таблицу
else
StringGrid1.Options := StringGrid1.Options - [goEditing]; // Запрещаем редактировать таблицу
if ACol = 5 then
begin
{Ширина и положение ComboBox должно соответствовать ячейке StringGrid}
R:= StringGrid1.CellRect(ACol, ARow);
R.Left:= R.Left + StringGrid1.Left;
R.Right:= R.Right + StringGrid1.Left;
R.Top:= R.Top + StringGrid1.Top;
R.Bottom:= R.Bottom + StringGrid1.Top;
ComboBox1.Left:= R.Left + 1;
ComboBox1.Top:= R.Top + 1;
ComboBox1.Width:= (R.Right + 1) - R.Left;
ComboBox1.Height:= (R.Bottom + 1) - R.Top; {Покажем combobox}
ComboBox1.Text:= '';
ComboBox1.Visible:= True;
ComboBox1.SetFocus;
end;
if ACol = 0 then
begin
{Ширина и положение MaskEdit должно соответствовать ячейке StringGrid}
R:= StringGrid1.CellRect(ACol, ARow);
R.Left:= R.Left + StringGrid1.Left;
R.Right:= R.Right + StringGrid1.Left;
R.Top:= R.Top + StringGrid1.Top;
R.Bottom:= R.Bottom + StringGrid1.Top;
MaskEdit2.Left:= R.Left + 1;
MaskEdit2.Top:= R.Top + 1;
MaskEdit2.Width:= (R.Right + 1) - R.Left;
MaskEdit2.Height:= (R.Bottom + 1) - R.Top; {Покажем MaskEdit}
MaskEdit2.Text:= '';
MaskEdit2.Visible:= True;
MaskEdit2.SetFocus;
end;
CanSelect:= True;
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case key of // Разрешаем вводить только цифры
'0'..'9' : ;
#8 : ;
#13: ;
else
key:= chr(0); // Другие символы не отображать
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
row: integer;
begin
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + FileNames); // Добавили новый запрос
Query1.Open; // Открыли запрос
Query1.first; // Перешли на первую запись
row:= 0;
StringGrid1.rowcount:= Query1.recordCount; // Выставили количество строк в сетке сколько записей в запросе
while not Query1.eof do // Пока не бедет конец запроса делаем
begin
StringGrid1.cells[0,row]:= '';
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO']; // Заносим данные в сетку
StringGrid1.cells[2,row]:= 'шт';
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
StringGrid1.cells[4,row]:= '';
StringGrid1.cells[5,row]:= '';
inc(row); // Увеличили на 1
Query1.next; // Перешли на новую запись запроса
end;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
StringGrid1.colWidths[1]:= StringGrid1.Width - 395;
end;
procedure TForm1.MaskEdit2Exit(Sender: TObject);
begin
{Перебросим выбранное в значение из MaskEdit в grid}
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:= MaskEdit2.Text;
MaskEdit2.Visible:= False; // Спрятали MaskEdit
StringGrid1.SetFocus; // Фокус на сетку
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree; // Освободили ресурсы занимаемые программой
end;
procedure TForm1.Button3Click(Sender: TObject);
var
s: string;
begin
s:= #39 + 'OSGP.DBF' + #39; // Сделали строку с именем таблицы для запроса
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + (#39 + 'OSGP.DBF' + #39)); // Добавили новый запрос
Query1.Open; // Открыли запрос
Form2.Showmodal; // Показ формы в модальном режиме
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Query1.Close; // Закрыли запрос
Form3.Showmodal; // Показ формы в модальном режиме
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB;
type
TForm2 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Close;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids;
type
TForm3 = class(TForm)
Button1: TButton;
Label1: TLabel;
ComboBox1: TComboBox;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
DBGrid1: TDBGrid;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses unit1;
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TForm3.FormResize(Sender: TObject);
begin
DBGrid1.Columns[1].Width:= DBGrid1.Width - 93;
end;
procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then // нажата клавиша enter
begin
if ComboBox1.Text = '' then
begin
ShowMessage('Выбирете сначала кладовщика');
exit;
end;
if RadioButton1.Checked then
begin
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Select NKART, NCHTO, NKL from ' + (#39 + 'OSGP.DBF' + #39) + ' where NKART = ' + (#39 + Edit1.Text + #39) + ' and (NKL = ' + #39 + ComboBox1.Text + #39 +')'); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
if Form1.Query1.RecordCount <> 0 then
ComboBox1.Text:= Form1.Query1.FieldValues['NKL']; // Показали в комбобоксе номер кладовщика
end
else
begin
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Select NKART, NCHTO, NKL from ' + (#39 + 'OSGP.DBF' + #39) + ' where (NCHTO LIKE "%' + AnsiUpperCase(Edit1.Text) +'%") and (NKL = ' + #39 + ComboBox1.Text + #39 +')'); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
end;
end;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
if ComboBox1.Text = '' then // Нужен ноиер кладовщика
begin
ShowMessage('Выбирете сначала кладовщика');
exit;
end;
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Select NKART, NCHTO from ' + (#39 + 'OSGP.DBF' + #39) + ' where NKL = ' + (#39 + ComboBox1.Items.Strings[ComboBox1.Itemindex] + #39)); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
end;
end.
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.