powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите найти непонятную ошибку!
16 сообщений из 16, страница 1 из 1
Помогите найти непонятную ошибку!
    #39667068
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая процедура пробития чека на новой онлайн кассе


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
   procedure TfrmMain.btncheckClick(Sender: TObject);
 var
  LastNode: PVirtualNode;
  Str: string;
  SumStr, CardNumber: string;
  Count: Integer;
  SumRefresh: Currency;
begin
  if IsFiscalExist then
  begin
    FDriver.Driver.Password := 30;
    if FDriver.Driver.GetECRStatus = 3 then
    begin
      ShowMessage('Смена превысила 24 часа!');
      Exit;
    end;
    RealCheckNumber := FDriver.Driver.OpenDocumentNumber + 1;
  end;
  LastNode := VT.GetFirst;
  while LastNode <> nil do
  begin
    Ch := VT.GetNodeData(LastNode);
    Kolvo := DM.GetKolvo(CH.id_sprtovara, Ch.id_sprserii, ch.id_sprproizv);
    if Kolvo < CH.kolvo then
    begin
        ShowMessage('Недостаточное количество товара: ' + CH.name_tovara + #13#10 +
        'Требуется: ' + FloatToStr(CH.kolvo) + #13#10 +
        'В наличии: ' + FloatToStr(Kolvo));
         SummaLack:= RoundTo(Summa, -2) ;
        lack := true;
       Exit;
    end;
    LastNode := VT.GetNext(LastNode);
  end;

 if frmMain.karta=1 then  oplata := 'оплата картой'
 else oplata := ''  ;
  CurCheckID := DM.InsertNewCheck(CurChangeID);
  LastNode := VT.GetFirst;

  if IsFiscalExist then
  begin
    FDriver.Driver.Password := 30;
    FDriver.Driver.UseReceiptRibbon := True;
    FDriver.Driver.UseJournalRibbon := True;
  end;

 if IsFiscalExist then
  begin

  Sum := Summa;
  Count := 0;

  if not dm.trWrite.InTransaction then
    dm.trWrite.StartTransaction;

  dm.writeQuery.Close;
  dm.writeQuery.SQL.Clear;

    dm.writeQuery.SQL.Add('insert into TABLEDOC (ID_DOC, ID_SPRTOVARA,' +
    'KOLVO, CENA, CENAOPT, SUMMA, ID_SPRPROIZV, ID_SPRSERII,vrach, Kod1C, Barcode, INN, Naklad, SummItog, Skidka) '+
    'values (:ID_DOC, :ID_SPRTOVARA, :KOLVO, :CENA, :CENAOPT, :SUMMA, :ID_SPRPROIZV, :ID_SPRSERII,:vrach, ' +
    ':kod1C, :barcode, :inn, :naklad, :SummItog, :Skidka)');

       dm.writeQuery2.Close;
       dm.writeQuery2.SQL.Clear;
       dm.writeQuery2.SQL.Add('update tnelikvid set kolvo = kolvo - :ikolvo where ((tovar = :idt) and (proizv = :idp) and (serii = :ids) and (cena = :icena))');


   SumRefresh := 0;
   SumKKT := 0;
   SummLast := 0;
   Disc2 := 0;
   Okrugl := false;
   LastNode := VT.GetFirst;

    while LastNode <> nil do
      begin

      Ch := VT.GetNodeData(LastNode);
      LastNode := VT.GetNext(LastNode);
      OldPrice := Ch.cena;
         if Discount > 0 Then Price := Ch.summa * (1 - Discount) / Ch.kolvo
        else Price := Ch.cena;

      Kolvo2 := Ch.kolvo;
      OldSum :=  roundto(Kolvo2, -3) * roundto(OldPrice, -2);
      Summ :=  roundto(Kolvo2, -3) * roundto(Price, -2);
      SummLast :=  SummLast + Summ;

      Skidka := OldSum - Summ;

      if (LastNode = Nil) then
         begin
            Disc2 := Summa - SummLast;
            Sum3 := Sum - Disc2;
            RoundSums;
         end;

      InsertIntoDB;
      SaleStr;

    end;
  end;

  if dm.trWrite.InTransaction then
    dm.trWrite.Commit;
     dm.writeQuery.Close;

      if dm.trWrite2.InTransaction then
      dm.trWrite2.Commit;
     dm.writeQuery2.Close;

    FDriver.Driver.CheckSubTotal;

    SumKKT := FDriver.Driver.Summ1 + Disc;

if karta=1 then
   begin
   FDriver.Driver.Summ4 := FDriver.Driver.Summ1;
   FDriver.Driver.Summ1 := 0;
   end
      else
           FDriver.Driver.Summ4 := 0;

       FDriver.Driver.Summ2 := 0; // Остальные типы оплаты нулевые, но их необходимо заполнить
       FDriver.Driver.Summ3 := 0;
       FDriver.Driver.Summ5 := 0;
       FDriver.Driver.Summ6 := 0;
       FDriver.Driver.Summ7 := 0;
       FDriver.Driver.Summ8 := 0;
       FDriver.Driver.Summ9 := 0;
       FDriver.Driver.Summ10 := 0;
       FDriver.Driver.Summ11 := 0;
       FDriver.Driver.Summ12 := 0;
       FDriver.Driver.Summ13 := 0;
       FDriver.Driver.Summ14 := 0;
       FDriver.Driver.Summ15 := 0;
       FDriver.Driver.Summ16 := 0;
       FDriver.Driver.RoundingSumm := 0; // Сумма округления
       FDriver.Driver.TaxValue1 := 0; // Налоги мы не считаем
       FDriver.Driver.TaxValue2 := 0;
       FDriver.Driver.TaxValue3 := 0;
       FDriver.Driver.TaxValue4 := 0;
       FDriver.Driver.TaxValue5 := 0;
       FDriver.Driver.TaxValue6 := 0;
       //FDriver.Driver.TaxType := 1; // Основная система налогообложения

     //27.03.2018

      FDriver.Driver.TagNumber := 1021;
      FDriver.Driver.TagType := 7;
      FDriver.Driver.TagValueStr := frmLogin.DBLookupComboBox1.Text;
      FDriver.Driver.FNSendTag;
      FDriver.Driver.TagNumber := 1203;
      FDriver.Driver.TagType := 7;
      FDriver.Driver.TagValueStr := frmLogin.INN;
      FDriver.Driver.FNSendTag;
      //FDriver.Driver.DocumentName := 'Имя документа';

       If (Disc > 0) or Okrugl then
       begin

         Str := 'ИТОГО БЕЗ СКИДКИ: ';
         if Okrugl then
         SumStr :=  FloatToStrF(Summa,ffCurrency, 10, 2)
           else
         SumStr :=  FloatToStrF(SumKKT,ffCurrency, 10, 2);
         while Length(Str + SumStr) < 30 do
         Str := Str + ' ';
         FDriver.Driver.StringForPrinting := Str + SumStr;
         FDriver.Driver.WaitForPrinting;
         FDriver.Driver.PrintString;

         Str := 'ИТОГО СКИДКА: ';
         if Okrugl then
         SumStr :=  FloatToStrF(Summa - SummLast,ffCurrency, 10, 2)
            else
         SumStr :=  FloatToStrF(Disc,ffCurrency, 10, 2);
         while Length(Str + SumStr) < 30 do
         Str := Str + ' ';
         FDriver.Driver.StringForPrinting := Str + SumStr;
         FDriver.Driver.WaitForPrinting;
         FDriver.Driver.PrintString;
      end;

      FDriver.Driver.StringForPrinting := '';
      FDriver.Driver.CloseCheckEx();
      DM.UpdateCheck(CurCheckID, SumKKT, Disc, Discount,oplata);

    FDriver.Driver.Password := 30;
    if FDriver.Driver.GetShortECRStatus = 8 then
      begin
        DM.CancellCheck(CurCheckID);
        FDriver.Driver.Password := 30;
        FDriver.Driver.CancelCheck;
        Exit;
      end;

  if IsFiscalExist then
  begin
   if (marker = 1) and (strNumCartMinus <> '') then
      begin
            //здесь нужно получить от сервера баллы и перевести их в %   [-];0130012942552
        GetDiscount;
        if (Result = '') or (Result = '0') or (Result = '-1') then
          begin
            TcpClient.Active := False;
            RefreshLabels;
          end
        else
        begin
        TcpClient.Active := True;
        TcpClient.Sendln('[-]' + ';' + strNumCartMinus + ';' + frmLogin.Options.codeapt +
          ';' +  CurrToStr(tmpSumDiscount) + ';' + IntToStr(DM.GetNumCheck(CurCheckID)));
        TcpClient.Active := False;
        end;
      end;
    if (strNumCart <> '') and (sum >= 300) then
      begin
       //ShowMessage(IntToStr(VT.TotalCount));
        TcpClient.RemoteHost := frmLogin.Options.RemoteAddress;
        TcpClient.RemotePort := frmLogin.Options.RemotePort;
        IdTCPClient.Host := frmLogin.Options.RemoteAddress;
        IdTCPClient.Port := StrToInt(frmLogin.Options.RemotePort);
      try
        IdTCPClient.Connect;
        try
          begin
      // Отсылка данных на сервер   [+];0130012942552;0,25;1;12.04.2012 10:02:00;38374
            if (Sum >= 1000) and (VT.TotalCount >= 2) then
              Ball := RoundTo(Sum * 0.05, -2)
            else
              Ball := RoundTo(Sum * 0.03, -2);
            // ShowMessage(CurrToStr(Ball));
            TcpClient.Active := True;
            TcpClient.Sendln('[+]' + ';' + strNumCart + ';' +
            CurrToStr(Ball) + ';' + frmLogin.Options.codeapt + ';' + DateTimeToStr(Now) + ';' +
            IntToStr(DM.GetNumCheck(CurCheckID)));
            TcpClient.Active := False;
          end;
        finally
          IdTCPClient.Disconnect;
        end;
        except
          on E: Exception do
          begin
            Ball := RoundTo(Sum * 0.03, -2);
            if (Sum >= 1000) and (Count >= 2) then
              Ball := RoundTo(Sum * 0.05, -2);
            //сохранять в файл
            FDriver.Driver.GetLongSerialNumberAndLongRNM;
            if not DirectoryExists(ExtractFileDir(Application.ExeName) + '\Discount\') then
              CreateDir(ExtractFileDir(Application.ExeName) + '\Discount\');
            NameDiscountFile := ExtractFileDir(Application.ExeName) + '\Discount\'+ frmLogin.Options.codeapt +
              FormatDateTime('ddmmyyyy', now) + FDriver.Driver.SerialNumber + '.dis';
            if not FileExists(NameDiscountFile) then
              begin
                AssignFile(DiscountFile, NameDiscountFile);
                Rewrite(DiscountFile);
                CloseFile(DiscountFile);
              end;
            AssignFile(DiscountFile, NameDiscountFile);
            Append(DiscountFile);
            Writeln(DiscountFile, '[+]' + ';' + strNumCart + ';' +
            CurrToStr(Ball) + ';' + frmLogin.Options.codeapt + ';' + DateTimeToStr(Now) + ';' +
            IntToStr(DM.GetNumCheck(CurCheckID)));
            CloseFile(DiscountFile);
          end;
      end;
      end;
   end;

  if (strNumCart <> '') or (strNumCartMinus <> '') then
    begin
      FDriver.Driver.Password := 30;

      FDriver.Driver.StringForPrinting := '';
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;

      if strNumCart <> '' then
        FDriver.Driver.StringForPrinting := 'НАЧИСЛЕНИЕ БОНУСОВ '
      else
        FDriver.Driver.StringForPrinting := 'СПИСАНИЕ БОНУСОВ ';
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;

      FDriver.Driver.StringForPrinting := 'Покупатель : ' + strNumCart;
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;

      FDriver.Driver.StringForPrinting := 'Дата операции : ' + DateTimeToStr(now) ;
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;

      if strNumCart <> '' then
        begin
          FDriver.Driver.StringForPrinting := 'Начисленно баллов с покупки : ' + CurrToStr(Ball);
          FDriver.Driver.PrintString;
          FDriver.Driver.WaitForPrinting;

          FDriver.Driver.StringForPrinting := 'На сумму покупки : ' + FloatToStrF(Sum - Sum * Discount, ffCurrency, 10, 2);
          FDriver.Driver.PrintString;
          FDriver.Driver.WaitForPrinting;
        end;

      if strNumCartMinus = '' then strNumCartMinus := strNumCart;
      CardNumber := strNumCartMinus;
      GetDiscount;
      Discount := 0;
      tmpSumDiscount := 0;
      strNumCartMinus := '';
      if (Result = '') or (Result = '-1') then Result := 'Нет связи с сервером';
      // 28.03.2018
      FDriver.Driver.StringForPrinting := 'Номер карты : ' + CardNumber;
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;
      // 28.03.2018
      FDriver.Driver.StringForPrinting := 'Баланс бонусов : ' + Result;
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;

      FDriver.Driver.StringForPrinting := ' ';
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;

      FDriver.Driver.Password := 30;
      FDriver.Driver.GetDeviceMetrics;
      if FDriver.Driver.UModel = 250 then
        FDriver.Driver.StringForPrinting := '                    СПАСИБО'
      else
        FDriver.Driver.StringForPrinting := '             СПАСИБО';
      FDriver.Driver.PrintString;
      FDriver.Driver.WaitForPrinting;

      FDriver.Driver.PrintCliche;
      FDriver.Driver.CutType := True;
      FDriver.Driver.CutCheck;

  end;

  VT.Clear;
  VT2.Clear;
  //-----------
  bonus:=0;
  //-----------

  Summa := 0;
  SumPremii := 0;
  Discount := 0;
  tmpSumDiscount := 0;
  Money := 0;
  strNumCart := '';
  strNumCartMinus := '';
  marker := 0;
  Ball := 0;
  karta:=0;
  FDriver.Driver.Summ1:=0;
  FDriver.Driver.Summ4:=0;
  FDriver.Driver.Summ3:=0;
  RefreshLabels;
end;





В ней есть вот такой кусок кода:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
  if (LastNode = Nil) then
         begin
            Disc2 := Summa - SummLast;
            Sum3 := Sum - Disc2;
            RoundSums;
         end;

      InsertIntoDB;
      SaleStr;
...



InsertIntoDB - процедура вставки строки в базу FireBird


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 
procedure TfrmMain.InsertIntoDB;
  begin
    dm.writeQuery.ParamByName('ID_DOC').AsInteger := CurCheckID;
    dm.writeQuery.ParamByName('ID_SPRTOVARA').AsInteger := Ch.id_sprtovara;
    dm.writeQuery.ParamByName('KOLVO').AsDouble := -RoundTo(Kolvo2, -3);
    dm.writeQuery.ParamByName('CENA').AsCurrency := RoundTo(Ch.Cena, -2);
    if CH.nacenka <> 0 then
       dm.writeQuery.ParamByName('CENAOPT').AsCurrency := RoundTo(CH.cena - (CH.nacenka * 1 / KoefTotal), -2)
       else dm.writeQuery.ParamByName('CENAOPT').AsCurrency := RoundTo(CH.cena, -2);
   dm.writeQuery.ParamByName('SUMMA').AsCurrency := RoundTo(Kolvo2 * Ch.Cena, -2);
    dm.writeQuery.ParamByName('ID_SPRPROIZV').AsInteger := CH.id_sprproizv;
    dm.writeQuery.ParamByName('ID_SPRSERII').AsInteger := CH.id_sprserii;
    dm.writeQuery.ParamByName('vrach').AsInteger := ch.vr_id;
    dm.writeQuery.ParamByName('kod1C').AsInteger := ch.Kod1C;
     dm.writeQuery.ParamByName('barcode').AsString := ch.barcode;
     dm.writeQuery.ParamByName('INN').AsString  := ch.INN;
     dm.writeQuery.ParamByName('Naklad').AsString  := ch.Naklad;
     dm.writeQuery.ParamByName('SummItog').AsCurrency  := RoundTo(Kolvo2, -3) * RoundTo(Price, -2);
     dm.writeQuery.ParamByName('Skidka').AsCurrency  := RoundTo(Skidka, -2);
     dm.writeQuery.ExecQuery;

     if (ch.nelikvid = true)  then
       begin
         dm.writeQuery2.ParamByName('idt').AsInteger := ch.id_sprtovara;
         dm.writeQuery2.ParamByName('idp').AsInteger := ch.id_sprproizv;
         dm.writeQuery2.ParamByName('ids').AsInteger := ch.id_sprserii;
          dm.writeQuery2.ParamByName('ikolvo').AsCurrency := ch.kolvo;
         dm.writeQuery2.ParamByName('icena').AsCurrency := ch.cena;
         dm.writeQuery2.ExecQuery;
       end;
  end;
    




SaleStr - передача строки чека кассовому аппарату


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
        procedure TfrmMain.SaleStr;
   var
    SumStr, Str: string;
     begin
       FDriver.Driver.CheckType := 1;
       FDriver.Driver.Quantity := RoundTo(Kolvo2,-3);
       FDriver.Driver.Price := RoundTo(Price, -2);
       FDriver.Driver.TaxValueEnabled := False; // Налог мы не рассчитываем
       FDriver.Driver.Tax1 := 0; // Без НДС
       FDriver.Driver.PaymentTypeSign := 4; // Признак способа расчета (Полный расчет)
       FDriver.Driver.PaymentItemSign := 1; // Признак предмета расчета (Товар)
       FDriver.Driver.StringForPrinting := Ch.name_tovara;
       FDriver.Driver.FNOperation;
    If (Skidka > 0) then
       begin
         Str := 'Без скидки:';
         SumStr :=  FloatToStrF(OldPrice * Kolvo2,ffFixed, 10, 2);
         Str := Str + FloatToStrF(Kolvo2, ffNumber, 10, 3) + 'x' +
                FloatToStrF(OldPrice, ffFixed, 10, 2) + '=';
         FDriver.Driver.StringForPrinting := Str + SumStr;
         FDriver.Driver.WaitForPrinting;
         FDriver.Driver.PrintString;
      end;
  end;
     





Так, вот раньше процедуры RoundSums (для округления цифр в чеке, чтобы не было лишних копеек) не было
Из нее при некоторых условиях вызываются по 1 разу InsertIntoDB и SaleStr (если в чеке есть скидка и еще пара условий, то есть не всегда вызываются).
Но вот когда вызываются, но тоже не всегда (!!!!) вылазит ошибка
авторParameter "ID_DOC" does not exist in DM.writeQuery.
Причем если набить чек заново, то со второй попытки все нормально пробивается!
Подскажите пожалуйста в чем может быть затычка!
Вот код процедуры RoundSums

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
      procedure TfrmMain.RoundSums;
var
   TmpSumm: Currency;
begin
 SumOst := Frac(SummLast);
 if Discount > 0 then
    begin
        if (SumOst > 0) and (SumOst <=0.4) then SummLast := SummLast - SumOst
          else if (SumOst > 0.4) and (SumOst <=0.60) then SummLast := SummLast - SumOst + 0.5
               else if (SumOst > 0.6) and (SumOst <=0.99) then SummLast:= SummLast - SumOst + 1;
    end
 else
     begin
       if (SumOst > 0) and (SumOst <0.5) then
          begin
             SummLast := SummLast - SumOst;
             Skidka := SumOst;
             Okrugl := true;
          end
            else if (SumOst > 0.5) and (SumOst < 0.9) then
              begin
                SummLast := SummLast - SumOst + 0.5;
                Skidka := SumOst - 0.5;
                Okrugl := true;
              end
                else if (SumOst > 0.9) and (SumOst < 0.99) then
                  begin
                   SummLast := SummLast - SumOst + 0.9;
                   Skidka := SumOst - 0.9;
                   Okrugl := true;
                end;
     end;
   Disc := Summa - SummLast;
  if ((Sum3 + Disc) <> Sum) then
     begin
      if SummLast > Sum3 then  Summ := Summ + (SummLast - Sum3) else Summ := Summ - (Sum3 - SummLast);
        if Kolvo2 = 1 Then
            begin
              Price := Summ;
              Skidka := OldPrice - Price;
            end
        else
           begin
              Price := RoundTo(Summ / Kolvo2, -2);
        if (roundto(Price * kolvo2, -2) <> roundto(summ, -2)) then
                  begin
                      if Kolvo2 > 1 then
                          begin
                              Kolvo2 := Kolvo2 - 1;
                              TmpSumm:= roundto(Price * kolvo2, -2);
                               OldSum :=  roundto(Kolvo2 * OldPrice, -2);

                                if BeginCheck then
                                    begin
                                     Skidka := OldSum - TmpSumm;
                                      InsertIntoDB;
                                      SaleStr;
                                      Kolvo2 := 1;
                                      Price := RoundTo(Summ, -2) -  RoundTo(TmpSumm, -2);
                                      Skidka := RoundTo(OldPrice, -2) - RoundTo(Price, -2);
                                      beginCheck:= false;
                                    end;
                          end;
                  end;
           end;
     end;
end;
    


...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667077
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

Текст ошибки говорит о том, что у тебя проблемы с записью в БД. Проверяй, как пишешь.
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667086
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster, логично. Самое плохое, что ошибка плавающая. Я не могу понять почему она возникает лишь иногда при прочих равных условиях
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667088
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

Очевидно потому, что если у вас округление, вы пытаетесь заполнить несуществующий параметр.
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667092
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster, это понятно. Непонятно, почему один раз он не существует, а в другой раз - существует.
Я же говорю - прочие условия равные (по крайней мере с точки зрения исходных данных). Набивается чек с одними и теми же позициями (то есть округление срабатывает в обоих случаях) на одной и то же машине. Но один раз ошибка вылазит, а во второй раз - нет. Такое ощущение, что дело в скорости набития чека или еще чего то, что оказывает влияние на запись строки в базу и отправки ее кассовому аппарату.
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667102
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010Непонятно, почему один раз он не существует, а в другой раз - существует.

Может дело в том, что текст запроса у dm.writeQuery меняется?
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667108
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

В пишущей query SQL запрос динамически формируется?
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667119
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...
  if not dm.trWrite.InTransaction then
    dm.trWrite.StartTransaction;

  dm.writeQuery.Close;
  dm.writeQuery.SQL.Clear;

    dm.writeQuery.SQL.Add('insert into TABLEDOC (ID_DOC, ID_SPRTOVARA,' +
    'KOLVO, CENA, CENAOPT, SUMMA, ID_SPRPROIZV, ID_SPRSERII,vrach, Kod1C, Barcode, INN, Naklad, SummItog, Skidka) '+
    'values (:ID_DOC, :ID_SPRTOVARA, :KOLVO, :CENA, :CENAOPT, :SUMMA, :ID_SPRPROIZV, :ID_SPRSERII,:vrach, ' +
    ':kod1C, :barcode, :inn, :naklad, :SummItog, :Skidka)');
...



Потом в цикле подставляются параметры посредством InsertIntoDb

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
...
   while LastNode <> nil do
      begin

      Ch := VT.GetNodeData(LastNode);
      LastNode := VT.GetNext(LastNode);
      OldPrice := Ch.cena;
         if Discount > 0 Then Price := Ch.summa * (1 - Discount) / Ch.kolvo
        else Price := Ch.cena;

      Kolvo2 := Ch.kolvo;
      OldSum :=  roundto(Kolvo2, -3) * roundto(OldPrice, -2);
      Summ :=  roundto(Kolvo2, -3) * roundto(Price, -2);
      SummLast :=  SummLast + Summ;

      Skidka := OldSum - Summ;

      if (LastNode = Nil) then
         begin
            Disc2 := Summa - SummLast;
            Sum3 := Sum - Disc2;
            RoundSums;
         end;

      InsertIntoDB;
      SaleStr;

    end;
...



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    procedure TfrmMain.InsertIntoDB;
  begin
    dm.writeQuery.ParamByName('ID_DOC').AsInteger := CurCheckID;
    dm.writeQuery.ParamByName('ID_SPRTOVARA').AsInteger := Ch.id_sprtovara;
    dm.writeQuery.ParamByName('KOLVO').AsDouble := -RoundTo(Kolvo2, -3);
    dm.writeQuery.ParamByName('CENA').AsCurrency := RoundTo(Ch.Cena, -2);
    if CH.nacenka <> 0 then
       dm.writeQuery.ParamByName('CENAOPT').AsCurrency := RoundTo(CH.cena - (CH.nacenka * 1 / KoefTotal), -2)
       else dm.writeQuery.ParamByName('CENAOPT').AsCurrency := RoundTo(CH.cena, -2);
   dm.writeQuery.ParamByName('SUMMA').AsCurrency := RoundTo(Kolvo2 * Ch.Cena, -2);
    dm.writeQuery.ParamByName('ID_SPRPROIZV').AsInteger := CH.id_sprproizv;
    dm.writeQuery.ParamByName('ID_SPRSERII').AsInteger := CH.id_sprserii;
    dm.writeQuery.ParamByName('vrach').AsInteger := ch.vr_id;
    dm.writeQuery.ParamByName('kod1C').AsInteger := ch.Kod1C;
     dm.writeQuery.ParamByName('barcode').AsString := ch.barcode;
     dm.writeQuery.ParamByName('INN').AsString  := ch.INN;
     dm.writeQuery.ParamByName('Naklad').AsString  := ch.Naklad;
     dm.writeQuery.ParamByName('SummItog').AsCurrency  := RoundTo(Kolvo2, -3) * RoundTo(Price, -2);
     dm.writeQuery.ParamByName('Skidka').AsCurrency  := RoundTo(Skidka, -2);
     dm.writeQuery.ExecQuery;
... 



И все работал без сбоев, пока не появился еще один вызов InsertIntoDB из RoundSums:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  procedure TfrmMain.RoundSums;
...

                                if BeginCheck then
                                    begin
                                     Skidka := OldSum - TmpSumm;
                                      InsertIntoDB;
                                      SaleStr;
                                      Kolvo2 := 1;
                                      Price := RoundTo(Summ, -2) -  RoundTo(TmpSumm, -2);
                                      Skidka := RoundTo(OldPrice, -2) - RoundTo(Price, -2);
                                      beginCheck:= false;
                                    end;
...
end;



Но вроде вызывается то InsertIntoDB все равно последовательно, так что не могу понять, откуда взялась эта ошибка и главное почему она плавающая
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667122
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Текст SQL запроса покажи
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667126
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кажется понял в чем дело, у меня dm.writeQuery.ExecQuery вызывается каждый раз из InsertIntoDB, а должен только один раз уже после цикла?
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667140
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010Кажется понял в чем дело, у меня dm.writeQuery.ExecQuery вызывается каждый раз из InsertIntoDB, а должен только один раз уже после цикла?
ExecQuery выполняет query. Что будет, если вы в InsertIntoDB установите параметры, но не выполните? Правильно, данные не попадут в БД.
Ошибка
арт2010Parameter "ID_DOC" does not exist in DM.writeQuery.
говорит о том, что такого параметра не нашли. А не найти его можно, когда текст запроса меняется. Он у вас вообще меняется? Или только один раз установили и не трогаете, и не очищаете?
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667142
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45,

1. Да, все верно, уже понял.
2. Текст запроса не меняется, только параметры
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667167
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Появилась мысль, что дело не в SQL. Процедура RoundSums вызывается не только при пробитии чека, но и до его пробития (и после) в процедуре вывода цифр на экран RefreshLabels:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
  procedure TfrmMain.RefreshLabels;
var
 LastNode: PVirtualNode;
begin
...
   while LastNode <> nil do
      begin
      Ch := VT.GetNodeData(LastNode);
      LastNode := VT.GetNext(LastNode);
      OldPrice := Ch.cena;
      if Discount > 0 Then Price := Ch.cena * (1 - Discount)
        else Price := Ch.cena;

     Kolvo2 := Ch.kolvo;

      Summ :=  roundto(Kolvo2, -3) * RoundTo(Price, -2);
      OldSum := Kolvo2 * OldPrice;
      SummLast := SummLast + Summ;

      //22.06.2018
      if (LastNode = Nil) then
         begin
            Disc2 := Summa - SummLast;
            Sum3 := Sum - Disc2;
            RoundSums;
         end;
       //22.06.2018
      end;
...



Поэтому поставил условие чтобы отделить простое округление с выводом экран и реальное пробитие позиции в чеке и запись его в БД
Код: pascal
1.
2.
3.
...
  if BeginCheck then
...



Которое иногда видимо срабатывает слишком рано

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    if (Msg.CharCode = VK_F12) and 	(FLastKeyCode <> VK_SHIFT) then
    begin
      BeginCheck := true;
  ...
      if summa <> 0 then
        begin
        ID := 0;
      btncheckClick(nil);
      summa := 0;
      RefreshLabels;
  ...
  



Сделаю тогда две разных процедуры и буду смотреть что получится
Всем спасибо за помощь
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667193
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010И все работал без сбоев, пока не появился еще один вызов InsertIntoDB из RoundSums:Очевидно же, что процедура RoundSums меняет текст запроса. Ищите где
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667237
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не очевидно. Я же приводил листинг RoundSums, текст запроса там нигде не изменяется
...
Рейтинг: 0 / 0
Помогите найти непонятную ошибку!
    #39667254
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
try
  dm.writeQuery.ParamByName('ID_DOC').AsInteger := CurCheckID;
except
  ShowMessage(dm.writeQuery.SQL.Text);
  raise;
end;
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите найти непонятную ошибку!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]