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

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


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

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

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

Boriss
Статус: Академик
Рейтинг: 1892
∙ повысить рейтинг »
star9491
Статус: Студент
Рейтинг: 1190
∙ повысить рейтинг »
Евгений/Genia007/
Статус: Бакалавр
Рейтинг: 704
∙ повысить рейтинг »

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

Номер выпуска:1505
Дата выхода:22.03.2010, 17:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:554 / 232
Вопросов / ответов:1 / 1

Вопрос № 177299: Здравствуйте уважаемые эксперты! Имеется программа: «Ввод остатков по складу готовой продукции» ССЫЛКА


Вопрос № 177299:

Здравствуйте уважаемые эксперты!
Имеется программа: «Ввод остатков по складу готовой продукции» ССЫЛКА

Записи в полях «Черт N – Наименование», «Ед. изм.» и «Цена» берутся из таблицы KACZCH.dbf, в остальные поля данные вводятся с клавиатуры, и по нажатию на кнопку «Сохранить» формируется файл OSGP.dbf куда передаются соответствующие данные из таблицы KACZCH.dbf и соответствующие введенные данные. Все данные хранящиеся в таблице OSGP.dbf можно посмотреть, нажав кнопку «Остатки». Нажав на кнопку «Оглавление» можно посмотреть остатки готовой продукции по отдельно выбранному кладовщику, нажав кнопку «Приход» можно сформировать приход ГП на склад по имеющимся данным из таблицы ARA.dbf, а также вписав новые данные. Сформированный приход записывается в таблицу Prin.dbf. В форме «Приход», нажав на кнопку «Принято» м ожно посмотреть кладовщика, принимавшего товар, № цеха-изготовителя, а также денежную сумму прихода ГП на склад, по каждому изделию.
Задание:
В главной форме «Ввод остатков по складу готовой продукции» создать кнопку «Выходные остатки», по нажатию на которую, открывается новая форма, в которой отображается сетка с полями:
1) “Наименование ЧТО”, которое берётся из таблиц OSGP.dbf, ARA.dbf и RAS.dbf, причём берутся все записи из полей NCHTO без повторений.
2) «Остаток начальный» – берется из таблицы OSGP.dbf из поля OST, причем если соответствующего «Наименования ЧТО» нет в таблице OSGP.dbf, то присваиваем ему значение 0 в данной записи.
3) «Приход» – берется из таблицы Prin.dbf из поля NKOL, причем если соответствующего «Наименования ЧТО» нет в таблице Prin.dbf, то присваиваем ему значение 0 в данной записи.
4) «Расход» – берется из таблицы RAS.dbf из поля KOL, причем если соответствующего «Наименования ЧТО» нет в таблице RAS.dbf, то присваиваем ему значение 0 в данной записи.
5) «Остаток выходной» – вычисляемое поле. Вычисляется таким образом: Поля «Остаток начальный» + (плюс) «Приход» – (минус) «Расход».

В шапке формы сделать поиск по наименованию.

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


Отвечает Евгений/Genia007/, Бакалавр :
Здравствуйте, Судейкин Андрей Владимирович.
Вот что у меня вышло:
дополнительная процедура в главном модуле:
Код:
procedure TForm1.BitBtn7Click(Sender: TObject);
var
i, x: word;
listNCHTO: TstringList;
s, s1: string;
begin
listNCHTO:= TStringList.Create;
listNCHTO.Sorted:= true;
listNCHTO.Duplicates:= dupIgnore; // Не добовлять повторяющиеся записи
//
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select KOL, NCHTO from ' + (#39 + 'RAS.dbf' + #39)); // Добавили новый запрос
Query1.Open; // Открыли запрос
Query1.First;
while not Query1.Eof do
begin
listNCHTO.Add(Query1.FieldValues['NCHTO']); Query1.Next;
end;
Query1.First;
//
Query2.Close; // Закрыли запрос
Query2.SQL.Clear; // Отчистили запрос
Query2.SQL.Add('Select DISTINCT NCHTO from ' + (#39 + 'ARA.dbf' + #39)); // Добавили новый запрос
Query2.Open; // Открыли запрос
Query2.First;
while not Query2.Eof do
begin
listNCHTO.Add(Query2.FieldValues['NCHTO']);
Query2.Next;
end;
//
Query3.Close; // Закрыли запрос
Query3.SQL.Clear; // Отчистили запрос
Query3.SQL.Add('Select OST, NCHTO from ' + (#39 + 'OSGP.dbf' + #39)); // Добавили новый запрос
Query3.Open; // Открыли запрос
Query3.First;
while not Query3.Eof do
begin
listNCHTO.Add(Query3.FieldValues['NCHTO']);
Query3.Next;
end;
Query3.First;
//
Query2.Close; // Закрыли запрос
Query2.SQL.Clear; // Отчистили запрос
Query2.SQL .Add('Select NKOL, NCHTO from ' + (#39 + 'Prin.dbf' + #39)); // Добавили новый запрос
Query2.Open; // Открыли запрос
Query2.First;
//
Form6.StringGrid1.RowCount:= listNCHTO.Count + 1;
for i:= 1 to listNCHTO.Count do
begin
s:= listNCHTO.Strings[i - 1];
Form6.StringGrid1.Cells[0, i]:= s;
//
while not Query3.Eof do
begin
s1:= Query3.FieldValues['NCHTO'];
if s1 = s then
begin
Form6.StringGrid1.Cells[1, i]:= FloatToStr(Query3.FieldValues['OST']);
break;
end
else
Form6.StringGrid1.Cells[1, i]:= '0';
Query3.Next;
end;
Query3.First;
//
x:= 0;
while not Query2.Eof do
begin
s1:= Query2.FieldValues['NCHTO'];
if s1 = s then
x:= x + Query2.FieldValues['NKOL'];
Query2.Next;
end;
Query2.First;
Form6.StringGrid1.Cells[2, i]:= inttostr(x);
//
while not Query1.Eof do
begin
s1:= Query1.FieldValues['NCHTO'];
if s1 = s then
begin
Form6.StringGrid1.Cells[3, i]:= FloatToStr(Query1.FieldValues['KOL']);
break;
end
else
Form6.StringGrid1.Cells[3, i]:= '0';
Query1.Next;
end;
Query1.First;
//
Form6.StringGrid1.Cells[4, i]:= FloatToStr(StrToFloat(Form6.StringGrid1.Cells[1, i]) + StrToFloat(Form6.StringGrid1.Cells[2, i]) - StrToFloat(Form6.StringGrid1.Cells[3, i]));
end;
Form6.visible:= true;
Query1.Close; // Закрыли запрос
Query2.Close; // Закрыли запрос
Query3.Close; // Закрыли запрос
listNCHTO.Free;
end;

Модуль новой формы:
Код:
unit Unit6;

interface

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

type
TForm6 = class(TForm)
BitBtn1: TBitBtn;
StringGrid1: TStringGrid;
Edit2: TEdit;
Label2: TLabel;
Image1: TImage;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form6: TForm6;
poloz: word;

implementation

{$R *.dfm}

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

procedure TForm6.FormCreate(Sender: TObject);
begin
// Выставляем нужную ширину колонок сетки
StringGrid1.colWidths[0]:= 304;
StringGrid1.Cells[0, 0]:= 'Наименование ЧТО';
StringGrid1.colWidths[1]:= 110;
StringGrid1.Cells[1, 0]:= 'Остаток начальный';
StringGrid1.colWidths[2]:= 60;
StringGrid1.Cells[2, 0]:= 'Приход';
StringGrid1.colWidths[3]:= 60;
StringGrid1.Cells[3, 0]:= 'Расход';
StringGrid1.colWidths[4]:= 100;
StringGrid1.Cells[4, 0]:= 'Остаток выходной';
//
poloz:= 1;
end;

procedure TForm6.FormResize(Sender: TObject);
begin
StringGrid1.colWidths[0]:= StringGrid1.Width - 355;
end;

procedure TForm6.Image1Click(Sender: TObject);
var
i:word;
s, s1: string;
begin
if Edit2.Text = '' then
exit;
if (poloz > 1) and (poloz < StringGrid1.RowCount - 1) then
begin
if mrOk = MessageDlg(&# 39;Продолжить поиск "OK", начать новый "Cancel"', mtConfirmation, [mbOK, mbCancel], 0) then
i:= poloz + 1
else
i:= 1;
end
else
i:= 1;
s:= AnsiUpperCase(Edit2.Text);
s1:= StringGrid1.Cells[0, i];
while (pos(s, s1) = 0) and (i < StringGrid1.RowCount - 1) do
begin
inc(i);
s1:= StringGrid1.Cells[0, i];
end;
StringGrid1.Row := i;
StringGrid1.TopRow := i - 1;
StringGrid1.LeftCol := 0;
poloz:= i;
if i = StringGrid1.RowCount - 1 then
begin
i:= 1;
s:= Edit2.Text;
s1:= StringGrid1.Cells[0, i];
while (pos(s, s1) <= 0) and (i < StringGrid1.RowCount - 1) do
begin
inc(i);
s1:= StringGrid1.Cells[0, i];
end;
end;
if i = StringGrid1.RowCount - 1 then
begin
StringGrid1.TopRow := 1;
poloz:= 1;
ShowMessage( 9;Поиск не дал результата.');
end
else
begin
StringGrid1.Row := i;
StringGrid1.TopRow := i - 1;
StringGrid1.LeftCol := 0;
poloz:= i;
end;
end;

procedure TForm6.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
Image1.OnClick(Image1);
end;

end.

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

Ответ отправил: Евгений/Genia007/, Бакалавр
Ответ отправлен: 20.03.2010, 14:02
Номер ответа: 260257

Оценка ответа: 5

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

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

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

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

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

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

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

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


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

    В избранное