Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 1815
∙ повысить рейтинг »
star9491
Статус: 10-й класс
Рейтинг: 823
∙ повысить рейтинг »
Евгений/Genia007/
Статус: Бакалавр
Рейтинг: 613
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Delphi и Lazarus

Номер выпуска:1500
Дата выхода:07.03.2010, 21:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:550 / 228
Вопросов / ответов:1 / 1

Вопрос № 177010: Здравствуйте уважаемые эксперты! Имеется программа: «Ввод остатков по складу готовой продукции» ССЫЛКА <img src="http://rfpro.ru/d/1717.png"> Записи в полях «Черт N – ...



Вопрос № 177010:

Здравствуйте уважаемые эксперты!
Имеется программа: «Ввод остатков по складу готовой продукции» ССЫЛКА
<img src="http://rfpro.ru/d/1717.png">
Записи в полях «Черт N – Наименование», «Ед. изм.» и «Цена» берутся из таблицы KACZCH.dbf, в остальные поля данные вводятся с клавиатуры, и по нажатию на кнопку «Сохранить» формируется файл OSGP.dbf куда передаются соответствующие данные из таблицы KACZCH.dbf и соответствующие введенные данные. Все данные хранящиеся в таблице OSGP.dbf можно посмотреть, нажав кнопку «Остатки». Нажав на кнопку «Оглавление» можно посмотреть остатки готовой продукции по отдельно выбранному кладовщику.
Задание:
1) Добавить выбор ещё двух кладовщиков, а именно чтобы было так:
1. Суворова А.Н.
2. Никитина Е.В.
3. Сидорова Е.М.
4. Платонова М.С.
5. Петрова И.Н.
Следовательно в форме «Оглавление» тоже поменять выбор кладовщиков. В OSGP.dbf запи сываются только порядковые номера кладовщиков (без фамилии).

2) В форме «Остатки» поменять расположение полей: «Цех-сдатчик ЧТО» после «№ карт.», а «Код заказа» перед «Код ЧТО»

3) Создать кнопку «Приход», по нажатию на которую открывалась бы новая форма:
сверху выбор кладовщика, по которому формируется приход, а ниже таблица записи из которой берутся из ARA.dbf. Выводимые поля: «Цех-изготовитель» - CI, «Наименование ЧТО» - NCHTO, «Сдаваемое кол-во» - KOL, «Дата» - вводится с клавиатуры (по маске), «Принято» - вводится с клавиатуры (если введенное число больше чем «Сдаваемое кол-во», то вывести сообщение « Вы не можете принимать больше сдаваемого кол-ва»).

Отправлен: 02.03.2010, 20:46
Вопрос задал: Судейкин Андрей Владимирович, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Евгений/Genia007/, Бакалавр :
Здравствуйте, Судейкин Андрей Владимирович.
Вот что получилось вместе с уточнениями из минифорума:
Код:
unit Unit5;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, Mask, DB;

type
TForm5 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ComboBox1: TComboBox;
Label1: TLabel;
CheckBox1: TCheckBox;
StringGrid1: TStringGrid;
MaskEdit1: TMaskEdit;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACo l, ARow: Integer;
var CanSelect: Boolean);
procedure CheckBox1Click(Sender: TObject);
procedure MaskEdit1Exit(Sender: TObject);
procedure StringGrid1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
function CreateTable(TabName, TabStruct, TabIDX: string): boolean;
public
{ Public declarations }
end;

var
Form5: TForm5;

implementation

uses Unit1, Unit2, Unit6;

{$R *.dfm}

const
CreateTab = 'CREATE TABLE ';
IDXTab = 'PRIMARY KEY ';
MyTabStruct =
'NKL DECIMAL(2), ' +
'CI CHARACTER(2), ' +
'NCHTO CHARACTER(50), ' +
'DOST DATE, ' +
'KOL DECIMAL(10), ' +
'NKOL DECIMAL(10) ';

function TForm5.CreateTable(TabName, TabStruct, TabIDX: string): boolean; // Создаём новую таблицу
begin
result := true;
with Form1.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 TForm5.BitBtn1Click(Sender: TObject);
var
i, j: integer;
begin
for i:= 0 to StringGrid1.ColCount do
for j:= 1 to StringGrid1.RowCount d o
StringGrid1.Cells[i, j]:= '';
StringGrid1.RowCount:= 2;
StringGrid1.ColCount:= 5;
Close;
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
// Выставляем нужную ширину колонок сетки
StringGrid1.colWidths[0]:= 96;
StringGrid1.Cells[0, 0]:= 'Цех-изготовитель';
StringGrid1.colWidths[1]:= 304;
StringGrid1.Cells[1, 0]:= 'Наименование ЧТО';
StringGrid1.colWidths[2]:= 64;
StringGrid1.Cells[2, 0]:= 'Дата';
StringGrid1.colWidths[3]:= 102;
StringGrid1.Cells[3, 0]:= 'Сдаваемое кол-во';
StringGrid1.colWidths[4]:= 112;
StringGrid1.Cells[4, 0]:= 'Принято';
StringGrid1.colWidths[5]:= 64;
StringGrid1.Cells[5, 0]:= 'Кладовщик';
//
StringGrid1.ColCount:= 5;
end;

procedure TForm5.ComboBox1Change(Sender: TObject);
var
i: integer;
begin
StringGrid1.ColCount:= 5;
if ComboBox1.Text = '' ; then // Нужен номер кладовщика
begin
ShowMessage('Выбирете сначала кладовщика');
exit;
end;
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Select CI, NCHTO, KOL from ' + (#39 + 'ARA.DBF' + #39)); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
Form1.Query1.First;
StringGrid1.RowCount:= Form1.Query1.RecordCount + 1;
for i:= 1 to Form1.Query1.RecordCount do
begin
StringGrid1.Cells[0, i]:= Form1.Query1.FieldValues['CI'];
StringGrid1.Cells[1, i]:= Form1.Query1.FieldValues['NCHTO'];
StringGrid1.Cells[2, i]:= DatetoStr(Date);
StringGrid1.Cells[3, i]:= Form1.Query1.FieldValues['KOL'];
StringGrid1.Cells[4, i]:= '';
Form1.Query1.Next;
end;
Form1.Query1.Close; // Закрыли запрос
MaskEdit1.Text:= DateToStr(Date);
end;

procedure TForm5.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
R: TRect;
begin
if (ACol = 2) or (ACol = 4) then // Редактируем только 2 и 4 ячейки
StringGrid1.Options := StringGrid1.Options + [goEditing] // Разрешаем редактировать таблицу
else
StringGrid1.Options := StringGrid1.Options - [goEditing]; // Запрещаем редактировать таблицу
if ACol = 2 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;
MaskEdit1.Left:= R.Left + 1;
MaskEdit1.Top:= R.Top + 1;
MaskEdit1.Width:= (R.Right + 1) - R.Left;
MaskEdit1.Height:= (R.Bottom + 1) - R.Top; {Покажем MaskEdit}
{ MaskEdit1.Text:= '';}
MaskEdit1.Visible:= True;
MaskEdit1.SetFocus;
end;
CanSelect:= True;< br>end;

procedure TForm5.CheckBox1Click(Sender: TObject);
var
i: integer;
begin
if CheckBox1.Checked then
for i:= 1 to StringGrid1.RowCount do
StringGrid1.Cells[4, i]:= StringGrid1.Cells[3, i]
else
for i:= 1 to StringGrid1.RowCount do
StringGrid1.Cells[4, i]:= '';
end;

procedure TForm5.MaskEdit1Exit(Sender: TObject);
begin
{Перебросим выбранное в значение из MaskEdit в grid}
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:= MaskEdit1.Text;
MaskEdit1.Visible:= False; // Спрятали MaskEdit
StringGrid1.SetFocus; // Фокус на сетку
end;

procedure TForm5.StringGrid1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i, j: integer;
begin
i:= StrToint(StringGrid1.Cells[4, StringGrid1.Row]);
j:= Strtoint(StringGrid1.Cells[3, StringGrid1.Row]);
if i > j then
begin
ShowMessage('Вы не можете принимать больш е сдаваемого кол-ва');
StringGrid1.Cells[4, StringGrid1.Row]:= StringGrid1.Cells[3, StringGrid1.Row];
end;
end;

procedure TForm5.BitBtn2Click(Sender: TObject);
var
i: integer;
s: string;
begin
if not FileExists(ExtractFilePath(ParamStr(0))+'Prin.dbf') then // Если таблицы не существует
CreateTable('"Prin.dbf"', MyTabStruct, ''); // Создаём её
Form1.Table1.TableName:= ExtractFilePath(ParamStr(0))+'Prin.dbf'; // Добавление имя базы
Form1.Table1.Active:= true; // Открыли таблицу

for i:= 1 to StringGrid1.RowCount do // Проходим все строки сетки
if StringGrid1.Cells[4, i] <> '' then // Если ввели число в ячейку
begin
s:= #39 + StringGrid1.Cells[1, i] + #39; // Получаем строку для запроса обрамлённую апострофами
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистил и запрос
Form1.Query1.SQL.Add('Select * from ' + FileNames + ' where NCHTO = '+s+''); // Добавили зап рос
Form1.Query1.Open; // Открыли запрос
if Form1.Table1.Locate('NCHTO', StringGrid1.Cells[1, i], [loPartialKey]) then // Нашли в таблице нужную запись
begin // Такие данные уже есть
if ((Form1.Table1.FieldValues['NKL'] = IntToStr(ComboBox1.itemindex + 1)) and (Form1.Table1.FieldValues['DOST'] = StringGrid1.Cells[2, i]) and (Form1.Table1.FieldValues['NKOL'] = StrtoFloat(StringGrid1.Cells[4, i]))) then
ShowMessage('Введенные данные для записи ' + StringGrid1.Cells[1, i] + ' имеются в базе Prin.dbf')
else
begin // Меняем данные в записи
Form1.Table1.Edit; // Ставим запись на редактирование
Form1.Table1.FieldValues['NKL']:= ComboBox1.ItemIndex + 1;
Form1.Table1.FieldValues['CI']:= StringGrid1.Cells[0, i]; // Записываем новые данные
Form1.Table1.FieldValues['NCHTO']:= StringGrid1.Cells[1, i];
Form1.Table1.FieldValues['DOST']:= StringGrid1.Cells[2, i];
Form1.Table1.FieldValues['KOL']:= StrToFloat(StringGrid1.Cells[3, i]);
Form1.Table1.FieldValues['NKOL']:= StrToFloat(StringGrid1.Cells[4, i]);
Form1.Table1.Post; // Сохранили изменения
end;
end
else // Нужную запись не нашли
if StringGrid1.Cells[4, i] <> '' then // Если ввели число в ячейку
begin
Form1.Table1.Insert; // Вставили новую запись в таблицу
Form1.Table1.FieldValues['NKL']:= ComboBox1.ItemIndex + 1;
Form1.Table1.FieldValues['CI']:= StringGrid1.Cells[0, i]; // Записываем новые данные
Form1.Table1.FieldValues['NCHTO']:= StringGrid1.Cells[1, i];
Form1.Table1.FieldValues['DOST']:= StringGrid1.Cells[2, i];
Form1.Table1.FieldValues['KOL']:= StrtoFloat(StringGrid1.Cells[3, i]);
Form1.Table1.FieldValues['NKOL']:= StrtoFloat(StringGrid1.Cells[4, i]);
Form1.Table1.Post; // Сохранили таблицу
end;
//
end;
Form1.Table1.Active:= false; // Закрыли таблицу
Form1.Query1.Close; // Закрыли запрос
ShowMessage('Данные сохранены на диск.');
end;

procedure TForm5.BitBtn3Click(Sender: TObject);
var
i: integer;
begin
StringGrid1.ColCount:= 6;
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Select * from ' + (#39 + 'Prin.dbf' + #39)); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
Form1.Query1.First;
StringGrid1.RowCount:= Form1.Query1.RecordCount + 1;
for i:= 1 to Form1.Query1.RecordCount do
begin
StringGrid1.Cells[0, i]:= Form1.Query1.FieldValues['CI'];
StringGrid1.Cells[1, i]:= Form1.Query1.FieldValues['NCHTO'];
StringGrid1.Cells[2, i]:= Form1.Query1.FieldValues['DOST'];
StringGrid1.Cells[3, i]:= Form1.Query1.FieldValues['KOL'];
StringGrid1.Cells[4, i]:= Form1.Query1.FieldValues['NKOL'];
StringGrid1.Cells[5, i]:= Form1.Query1.FieldValues['NKL'];
Form1.Query1.Next;
end;
Form1.Query1.Close; // Закрыли запрос
end;

procedure TForm5.BitBtn4Click(Sender: TObject);
var
i: integer;
begin
Form1.Table1.TableName:= ExtractFilePath(ParamStr(0))+'KACZCH.DBF'; // Добавление имя базы
Form1.Table1.Active:= true; // Открыли таблицу
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Selec t CI, NCHTO, NKOL from ' + (#39 + 'Prin.dbf' + #39)); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос< br> Form1.Query1.First;
Form6.StringGrid1.RowCount:= Form1.Query1.RecordCount + 1;
for i:= 1 to Form1.Query1.RecordCount do
begin
Form6.StringGrid1.Cells[0, i]:= Form1.Query1.FieldValues['CI'];
Form6.StringGrid1.Cells[1, i]:= Form1.Query1.FieldValues['NCHTO'];
if Form1.Table1.Locate('NCHTO', Form6.StringGrid1.Cells[1, i], [loPartialKey]) then // Нашли в таблице нужную запись
begin
Form6.StringGrid1.Cells[2, i]:= Form1.Query1.FieldValues['NKOL'] * Form1.Table1.FieldValues['OCN'];
end;
Form1.Query1.Next;
end;
Form1.Query1.Close; // Закрыли запрос
Form1.Table1.Active:= false; // Закрыли таблицу
Form6.Visible:= true;
end;

procedure TForm5.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
s: string;
begin
s:= StringGrid1.Cells[4, StringGrid1.Row];
if ComboBox1.Text = '' then
begin
ShowMessage('Вы не можете принимать товар без выбора кладовщика!');
StringGrid1.Cells[4, StringGrid1.Row]:= s;
end;
end;

end.

unit Unit6;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids;

type
TForm6 = class(TForm)
BitBtn1: TBitBtn;
StringGrid1: TStringGrid;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.BitBtn1Click(Sender: TObject);
begin
Close
end;

procedure TForm6.FormCreate(Sender: TObject);
begin
// Выставляем нужную ширину колонок сетки
StringGrid1.colWidths[0]:= 96;
StringGrid1.Cells[0, 0]:= & #39;Цех-изготовитель';
StringGrid1.colWidths[1]:= 304;
StringGrid1.Cells[1, 0]:= 'Наименование ЧТО';
StringGrid1.colWidths[2]:= 185;
StringGrid1.Cells[2, 0]:= 'Общая стоимость';
//
end;

end.
Весь проект здесь.
-----
Помогли тебе, помоги и ты.

Ответ отправил: Евгений/Genia007/, Бакалавр
Ответ отправлен: 05.03.2010, 16:23
Номер ответа: 259910

Оценка ответа: 5
Комментарий к оценке:
Огромное спасибо! На вас всегда можно положиться! Всегда понятные и грамотные ответы

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 259910 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.03.2010

    В избранное