Jump to content

Fehler EAssertionFailed : TUniDBGrid.MoveToRow(): Unexpected Row number. (H:\Framework\uniGUI\uniDBGrid.pas, Zeile 1929)


akio

Recommended Posts

Hallo,

 

ich arbeite mit Delphi XE8 und möchte einen Intranet Onlineshop aufbauen...

 

Soweit so gut, funktioniert alles, bisher ohne Probleme... Doch leider bekomme ich des öfteren eine Fehlermeldung,

wenn ich meinen Button "in Warenkorb" zwei mal, etwas schneller nach Programmstart, betätige... Leider kann ich mir aus der Fehlermeldung auch keinen Zusammenhang erschließen, was das sein könnte :/

 

Fehler:

"EAssertionFailed : TUniDBGrid.MoveToRow(): Unexpected Row number. (H:\Framework\uniGUI\uniDBGrid.pas, Zeile 1929)"

 

Sobald ich diese Meldung erhalte, scheint der Artikel auch nicht im Warenkorb.

Nach Erhalt dieser Fehlermeldung, kommt diese auch nie wieder, und kann so oft und so schnell die Button "in Warenkorb" drücken wie ich will... Alles ohne Probleme...

Außer beim Ersten Login zum Shop:

1. Der Erste Artikel im Warenkorb legen - geht

2. Den gleichen oder einen anderen Artikel im Warenkorb legen, das gaanz schnell danach - FEHLER! - Wenn ich mir 3-5 Sekunden Zeit lasse, kommt sie nicht.

3. Die nachfolgenden Artikel, wie gesagt, alles ohne Probleme, und so schnell wie ich will... 

 

Ich hoffe, ihr könnt mir folgen^^

 

Ansonsten gerne Fragen...

 

Hier mal der Code:

 

Das ist der Button, welchen ich betätige:

procedure Tfmstart1.ButtonZumWarenkorbClick(Sender: TObject);
begin
  if (Sender is TUniButton)  then
   begin
     try
       UniMainModule.Artikel := TUniButton(Sender).Hint;
       fmProdukt1.UniNumberEdit1.Text := MengenArray[TUniButton(Sender).Tag].Text;

       fmProdukt1.UniButton1.Click;
     except
       on E : Exception do ShowMessage(E.Message);
     end;
   end;
end;

Das ist die procedure in der Produktansicht (andere Form), welcher im Anschluss dann in den Warenkorb gelegt wird:

procedure Tfmprodukt1.UniButton1Click(Sender: TObject);
var
 preis, VK1, Kondition: String;
 menge: Integer;
 sl:TStringList;
begin

  UniMainModule.mySQLQuery1.SQL.Clear;
  UniMainModule.mySQLQuery1.SQL.Add('select a.ArtNr, b.Hersteller, b.ArtName, b.ArtBZ, a.VK1, b.ArtPreis, a.Kondition, b.class');
  UniMainModule.mySQLQuery1.SQL.Add('from');
  UniMainModule.mySQLQuery1.SQL.Add('userartikel a');
  UniMainModule.mySQLQuery1.SQL.Add('inner join artikelliste b');
  UniMainModule.mySQLQuery1.SQL.Add('on b.ArtNr = a.ArtNr');
  UniMainModule.mySQLQuery1.SQL.Add('where a.ident = ' + IntToStr(UniMainModule.Ident));
  UniMainModule.mySQLQuery1.SQL.Add('AND b.ArtNr like "' + UniMainModule.Artikel + '";');
  UniMainModule.mySQLQuery1.Open;

  fmwarenkorb.UniStringGrid1.RowCount := fmwarenkorb.UniStringGrid1.RowCount +1;

  fmwarenkorb.UniStringGrid1.Cells[0,UniMainModule.Row] := UniMainModule.mySQLQuery1.fieldByName('ArtNr').AsString;
  fmwarenkorb.UniStringGrid1.Cells[1,UniMainModule.Row] := UniMainModule.mySQLQuery1.fieldByName('Hersteller').AsString + ' ' + UniMainModule.mySQLQuery1.fieldByName('ArtName').AsString;
  fmwarenkorb.UniStringGrid1.Cells[5,UniMainModule.Row] := '  > Entfernen <';
  fmwarenkorb.UniStringGrid1.Cells[6,UniMainModule.Row] := ' -';
  fmwarenkorb.UniStringGrid1.Cells[7,UniMainModule.Row] := ' +';
  
  //Preisberechnung:
       VK1 := UniMainModule.mySQLQuery1.fieldByName('VK1').AsString;
       Preis := UniMainModule.mySQLQuery1.fieldByName('ArtPreis').AsString; //Listenpreis
       kondition := UniMainModule.mySQLQuery1.fieldByName('Kondition').AsString;

       if (VK1 = '') or (VK1 = '0') then
        begin
          if (Kondition = '') or (Kondition = '0') then
           begin
             //Listenpreis
           end
          else
           begin
             //Prozente abrechnen
             Preis := UniMainModule.mySQLQuery1.fieldByName('ArtPreis').AsString;
             Preis := FloatToStr(StrToFloat(Preis) - (StrToFloat(Preis) / 100) * StrToFloat(Kondition));
           end;
        end
       else
        begin
          //Festen VK übernehmen
          Preis := VK1;
        end;

  menge := StrToInt(UniNumberEdit1.Text);

  fmwarenkorb.UniStringGrid1.Cells[2,UniMainModule.Row] := IntToStr(menge);
  fmwarenkorb.UniStringGrid1.Cells[3,UniMainModule.Row] := FormatFloat(',.00',StrToFloat(preis)) + ' EUR';
  preis := FloatToStr(StrToFloat(preis) * Menge);
  fmwarenkorb.UniStringGrid1.Cells[4,UniMainModule.Row] := FormatFloat(',.00',StrToFloat(preis)) + ' EUR';

  UniMainModule.row := UniMainModule.row +1;

  close;
end;

Ich hoffe, ihr habt einen passenden Rat.

 

Ich freue mich auf ein Feedback.

 

LG

Karsten

 

 

 

 

post-2963-0-61352600-1444339329_thumb.png

post-2963-0-95874800-1444339330_thumb.png

Link to comment
Share on other sites

Hallo Karsten,

 

kurze Frage: Wenn ich dich richtig verstehe ist der "Fehler" nur bei mehrfachem Klick ?

 

Was passiert, wenn du bei "ButtonZumWarenkorbClick" in der ersten Zeile

 

  • ButtonZumWarenkorb.enabled:=false;

 

und nach deiner Preisberechnung:

 

  • ButtonZumWarenkorb.enabled:=true;

reinschreibst?

 

Lg

Erich

Link to comment
Share on other sites

Hallo Erich,

 

das Problem tritt nur EINMAL auf, und zwar beim 2. Klick "in Warenkorb". Danach ist das kein Problem mehr - Ich klicke und klicke so schnell und oft wie ich will.

 

Aber ich teste es gerne auf den Nachmittag und kann Dir dann ein Feedback geben. Vielleicht brauch der beim Programmstart etwas länger, um den Code abzuarbeiten, keine Ahnung :D

 

LG

Karsten

Link to comment
Share on other sites

German:

das muss etwas am Programmstart zutun haben. Nach dem ich, statt "in Warenkorb" etwas anderes mache, wie z.B. "Produkt infos anzeigen", und im Anschluss dann ganz oft "in Warenkorb" bestätige, passiert nichts... Alles ohne eine Fehlermeldung. Schon irgendwie merkwürdig.

 

Google Translater in english :D

that must have some intervention at program start. After I, instead of "add to cart" doing something else, such as "More info Show", and after then quite often "add to cart" confirm, nothing happens ... all without an error message. Already somehow strange.

Link to comment
Share on other sites

@Admin

ok, I will soon make an update.

 

@Erich

Leider hat es nichts gebracht.

 

Die Fehlermeldung kommt auch dann, nachdem ich den Ersten Artikel im Warenkorb gelegt habe und anschließend den Warenkorb öffnen möchte O.o

Also das verstehe ich nun gar nicht... 

 

Warenkorb anzeigen:

procedure Tfmstart1.UniButton10Click(Sender: TObject);
begin
  if fmWarenkorb.UniStringGrid1.RowCount > 1 then //
   begin
    fmWarenkorb.ShowModal();
   end
  else
   begin
     ShowMessage('Es befindet sich kein Artikel im Warenkorb!');
   end;
end;

onCreate:

procedure Tfmstart1.UniFormCreate(Sender: TObject);
var
  ini: TIniFile;
  filename: String;
begin

  UniMainModule.Row := 1;

  UniScrollbox1.Left := screen.Width div 2 - UniScrollbox1.Width div 2;
  UniEdit1.Left := UniScrollbox1.Left;
  UniButton1.Left := UniEdit1.Left + UniEdit1.Width + 10;
  UniImage1.Left := screen.Width div 2 - UniImage1.Width div 2;
  UniImage2.Left := UniImage1.Left + UniImage1.Width -5;

  //Alle Produkte anzeigen:
  UniButton11.Click;

  //Admin
  //UniButton2.Visible := UniMainModule.Admin;

  //RR Adresse = Auftraggeber
  UniMemo2.Clear;
  UniMemo2.Lines.Add(UniMainModule.Firma);
  if UniMainModule.Adress1 <> '' then UniMemo2.Lines.Add(UniMainModule.Adress1);
  if UniMainModule.Adress2 <> '' then UniMemo2.Lines.Add(UniMainModule.Adress2);
  UniMemo2.Lines.Add(UniMainModule.Straße);
  UniMemo2.Lines.Add(UniMainModule.PLZ + ' ' + UniMainModule.Ort);
  UniMemo2.Lines.Add(UniMainModule.Land);
  fmwarenkorb.UniMemo1.Lines.Text := UniMemo2.Lines.Text;  //In Warenkorb anzeigen lassen

  //LS Adresse = Auftraggeber
  UniMemo3.Lines.Text := UniMemo2.Lines.Text;
  fmwarenkorb.UniMemo2.Lines.Text := UniMemo3.Lines.Text;  //In Warenkorb anzeigen lassen

  //RR Adresse in Variablen packen
  UniMainModule.RRFirma := UniMainModule.Firma;
  UniMainModule.RRAdress1 := UniMainModule.Adress1;
  UniMainModule.RRAdress2 := UniMainModule.Adress2;
  UniMainModule.RRStraße := UniMainModule.Straße;
  UniMainModule.RRPLZ := UniMainModule.PLZ;
  UniMainModule.RROrt := UniMainModule.Ort;
  UniMainModule.RRLand := UniMainModule.Land;

  //LS Adresse in Variablen packen
  UniMainModule.LSFirma := UniMainModule.Firma;
  UniMainModule.LSAdress1 := UniMainModule.Adress1;
  UniMainModule.LSAdress2 := UniMainModule.Adress2;
  UniMainModule.LSStraße := UniMainModule.Straße;
  UniMainModule.LSPLZ := UniMainModule.PLZ;
  UniMainModule.LSOrt := UniMainModule.Ort;
  UniMainModule.LSLand := UniMainModule.Land;

  //Ansprechpartner anzeigen:
  //UniPanel4.Caption := UniMainModule.Betreuer;
  UniPanel4.Top := 0;
  UniPanel4.Left := screen.Width - UniPanel4.Width;

  //daten laden
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\files\Betreuer\Betreuer.ini');
  try
    UniImage3.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\files\Betreuer\' + UniMainModule.Betreuer + '.jpg');
    UniLabel9.Caption := ini.ReadString(UniMainModule.Betreuer, 'Name', '');
    UniLabel10.Caption := ini.ReadString(UniMainModule.Betreuer, 'Tel', '');
    UniLabel11.Caption := ini.ReadString(UniMainModule.Betreuer, 'Mail', '');
    UniLabel12.Caption := ini.ReadString(UniMainModule.Betreuer, 'Zitat', '');
  finally
    ini.Free;
  end;

end;

UniButton11: "Alle Produkte anzeigen:"

procedure Tfmstart1.UniButton11Click(Sender: TObject);
begin
  UniMainModule.mySQLQuery1.SQL.Clear;
  UniMainModule.mySQLQuery1.SQL.Add('select a.ArtNr, b.Hersteller, b.ArtName, b.ArtBZ, a.VK1, b.ArtPreis, a.Kondition, b.class');
  UniMainModule.mySQLQuery1.SQL.Add('from userartikel a');
  UniMainModule.mySQLQuery1.SQL.Add('inner join artikelliste b');
  UniMainModule.mySQLQuery1.SQL.Add('on b.ArtNr = a.ArtNr');
  UniMainModule.mySQLQuery1.SQL.Add('where a.ident = ' + IntToStr(UniMainModule.Ident));

  UniButton6.Click; //Ausführen
end;

UniButton6.Click: //Ausführen

procedure Tfmstart1.UniButton6Click(Sender: TObject);
var
 i, n, count, acount: Integer;
 VK1, ArtPreis, kondition, Preis, str_, test: String;
begin

  try
    //UniMainModule.mySQLQuery1.SQL.Text := UniMemo1.Lines.Text;
    UniMainModule.mySQLQuery1.Open;

    count := UniMainModule.mySQLQuery1.RecordCount;

    //Versand erst einmal auf o setzen
    UniMainModule.Versand := '8,30';

    // Panels freigeben
    for i := Low(PanelArray) to StrToInt(UniEdit2.Text) do //High(PanelArray) do
     begin
       PanelArray[i].Free;
     end;

    UniEdit2.Text := IntToStr(count);

    UniPanel1.Height := 0;
    n:= 1;
    For i := 1 to count do
     begin
       //ShowMessage(test);
       test := UniMainModule.mySQLQuery1.FieldByName('ArtNr').AsString;
       if test = '69789789' then //Versandartikel
        begin
          if UniMainModule.mySQLQuery1.fieldByName('VK1').AsString <> '' then
           begin
             UniMainModule.Versand := UniMainModule.mySQLQuery1.fieldByName('VK1').AsString;
           end;
        end
       else
        begin

       //Panel erstellen
       PanelArray[n] := TUniPanel.Create(self);
       PanelArray[n].Parent := UniPanel1;
       PanelArray[n].SetBounds(0,100 * n -100,UniPanel1.Width,100);
       PanelArray[n].Name := 'ArrayPanel' + IntToStr(n);

       //WarenkorbButton auf erstellten Panel erstellen
       WarenkorbButtonArray[n] := TUniButton.Create(self);
       WarenkorbButtonArray[n].Parent := PanelArray[n];
       WarenkorbButtonArray[n].SetBounds(PanelArray[n].Width - 100 , PanelArray[n].Height - 30 ,96,25);
       WarenkorbButtonArray[n].Caption := 'In Warenkorb';
       WarenkorbButtonArray[n].Tag := n;
       WarenkorbButtonArray[n].Name := 'ArrayWarenkorbButton' + IntToStr(n);
       WarenkorbButtonArray[n].Hint := UniMainModule.mySQLQuery1.FieldByName('ArtNr').AsString;        //UniMainModule.SQLTable1.fieldByName('ArtNr').AsString;
       WarenkorbButtonArray[n].ScreenMask.Enabled := true;
       WarenkorbButtonArray[n].OnClick := ButtonZumWarenkorbClick;

       //MengenEdit auf erstellten Panel erstellen
       MengenArray[n] := TUniNumberEdit.Create(self);
       MengenArray[n].Parent := PanelArray[n];
       MengenArray[n].SetBounds(PanelArray[n].Width - WarenkorbButtonArray[n].Width-40, PanelArray[n].Height - 30 ,37,25);
       MengenArray[n].Text := '1';
       MengenArray[n].Tag := n;
       MengenArray[n].Name := 'ArrayMengen' + IntToStr(n);
       MengenArray[n].Hint := WarenkorbButtonArray[n].Hint;        //UniMainModule.SQLTable1.fieldByName('ArtNr').AsString;
       MengenArray[n].OnKeyPress := MengenKeyPress;
       MengenArray[n].OnKeyDown := MengenKeyDown;
       MengenArray[n].OnExit := MengenExit;

       //ProduktButton auf erstellten Panel erstellen
       ButtonArray[n] := TUniButton.Create(self);
       ButtonArray[n].Parent := PanelArray[n];
       ButtonArray[n].SetBounds(PanelArray[n].Width - 80 - WarenkorbButtonArray[n].Width -5 - MengenArray[n].Width -5 , PanelArray[n].Height - 30 ,75,25);
       ButtonArray[n].Caption := 'Anzeigen...';
       ButtonArray[n].Tag := n;
       ButtonArray[n].Name := 'ArrayButton' + IntToStr(n);
       ButtonArray[n].Hint := WarenkorbButtonArray[n].Hint;        //UniMainModule.SQLTable1.fieldByName('ArtNr').AsString;
       ButtonArray[n].ScreenMask.Enabled := true;
       ButtonArray[n].OnClick := ButtonWarenkorbClick;

       //Image setzen
       //Button auf erstellten Panel erstellen
       ImageArray[n] := TUniImage.Create(self);
       ImageArray[n].Parent := PanelArray[n];
       ImageArray[n].SetBounds(5, 5, 90, 90);
       ImageArray[n].Center := true;
       ImageArray[n].Stretch := true;
       ImageArray[n].Hint := WarenkorbButtonArray[n].Hint;
       ImageArray[n].Cursor := crHandPoint;
       ImageArray[n].OnClick := ButtonWarenkorbClick;
       try
         ImageArray[n].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\files\pics\ArtNr\' + UniMainModule.mySQLQuery1.fieldByName('ArtNr').AsString + '.jpg');
       except
         //nix
       end;
       //ImageArray[n].Url := ExtractFilePath(ParamStr(0)) + '\files\pics\ArtNr\' + UniMainModule.mySQLQuery1.fieldByName('ArtNr').AsString + '.jpg';

       //Label setzen und Namen aus Datenbank definieren
       ArtNameArray[n] := TUniLabel.Create(self);
       ArtNameArray[n].Parent := PanelArray[n];
       ArtNameArray[n].SetBounds(ImageArray[n].Width + 5, 10 ,100,13);
       ArtNameArray[n].Font.Style := [fsBold, fsUnderline];
       ArtNameArray[n].Caption := UniMainModule.mySQLQuery1.fieldByName('Hersteller').AsString + ' ' + UniMainModule.mySQLQuery1.fieldByName('ArtName').AsString;
       ArtNameArray[n].Hint := WarenkorbButtonArray[n].Hint;
       ArtNameArray[n].Cursor := crHandPoint;
       ArtNameArray[n].ScreenMask.Enabled := true;
       ArtNameArray[n].OnClick := ButtonWarenkorbClick;

       //Label setzen und BZ aus Datenbank definieren
       ArtBZArray[n] := TUniLabel.Create(self);
       ArtBZArray[n].Parent := PanelArray[n];
       ArtBZArray[n].SetBounds(ImageArray[n].Width + 10, ArtNameArray[n].Top + 20 ,100,13);
       str_ := UniMainModule.mySQLQuery1.fieldByName('ArtBZ').AsString;
       if Length(Str_) >= 70 then
        begin
          Delete(Str_, 70, Length(Str_));
          Str_ := Str_ + ' ...';
        end;
       ArtBZArray[n].Caption := Str_;

       //Label setzen und ArtNr aus Datenbank definieren
       ArtNrArray[n] := TUniLabel.Create(self);
       ArtNrArray[n].Parent := PanelArray[n];
       ArtNrArray[n].SetBounds(ImageArray[n].Width + 10, ArtBZArray[n].Top + 20, 50, 13);
       ArtNrArray[n].Caption := 'Art. Nr.: ' + UniMainModule.mySQLQuery1.fieldByName('ArtNr').AsString;

       //Label setzen und ArtPreis aus Datenbank definieren
       ArtPreisArray[n] := TUniLabel.Create(self);
       ArtPreisArray[n].Parent := PanelArray[n];
       ArtPreisArray[n].SetBounds(ImageArray[n].Width + 10, ArtNrArray[n].Top + 20, 50, 13);
       ArtPreisArray[n].Font.Style := [fsBold];
       ArtPreisArray[n].Font.Color := clTeal;
       ArtPreisArray[n].Font.Size := 9;

       VK1 := UniMainModule.mySQLQuery1.fieldByName('VK1').AsString;
       Preis := UniMainModule.mySQLQuery1.fieldByName('ArtPreis').AsString;  //Listenpreis laden
       kondition := UniMainModule.mySQLQuery1.fieldByName('Kondition').AsString;

       if (VK1 = '') or (VK1 = '0') then
        begin
          if (Kondition = '') or (Kondition = '0') then
           begin
             //Listenpreis
           end
          else
           begin
             //Konditionen
             Preis := FloatToStr(StrToFloat(Preis) - (StrToFloat(Preis) / 100) * StrToFloat(Kondition));
           end;
        end
       else
        begin
          Preis := VK1;
        end;

       ArtPreisArray[n].Caption := 'Ihr Preis: ' + FormatFloat(',.00',StrToFloat(preis)) + ' EUR';

       //TPanel in der höhe erweitern
       UniPanel1.Height := UniPanel1.Height + PanelArray[n].Height;

       n := n+1;
       end;

       UniMainModule.mySQLQuery1.Next;
     end;
  except
      on E : Exception do ShowMessage(E.Message);
  end;
UniButton1.Enabled := true;
end;
Link to comment
Share on other sites

Boar ich habe glaub DIE LÖSUNG....

 

In "Ausführen" sage ich ja UniMainModule.mySQLQuery1.next; um den nächsten Datensatz / Artikel zu bearbeiten bzw anzeigen zu lassen ...

 

Jetzt habe ich aus Spaß mal "UniMainModule.mySQLQuery1.First;" in der letzten Zeile unter Button.enabled := true ergänzt, dass er wieder in die erste Zeile springt und siehe da: Es kommt KEINE Fehlermeldung mehr...

 

Man ist das eine schwere Geburt :D Vielen Dank für die zusätzlichen Denkansätze^^

 

[gelöst]

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...