Saves more records than Needed in my DB

Asked

Viewed 87 times

2

Follows the code:

// Leitura Dados Itens da Nota Fiscal...
xmlNCab := NoPrinc.ChildNodes.FindNode('det');
while not (xmlNCab = Nil) do
begin
    inc(l);
    sgProds.RowCount := l;
    //xmlNCab.ChildNodes.FindNode('det');
    xmlNItm := xmlNCab.ChildNodes['prod'];

    cProd := xmlNItm.ChildNodes['cProd'  ].Text; // Código do produto CFOP
    xProd := xmlNItm.ChildNodes['xProd'  ].Text; // Nome do produto
    uCom := xmlNItm.ChildNodes['uCom'    ].Text; // Sigla unidade da embalagem
    qCom := xmlNItm.ChildNodes['qCom'    ].Text; // Quantidade do produto (4dec,S/M)
    vUnCom := xmlNItm.ChildNodes['vUnCom'].Text; // Valor unitário do produto (4dec,S/M)
    vProd := xmlNItm.ChildNodes['vProd'  ].Text; // Valor total do produto (2dec,S/M)

    sgProds.Cells[0,l] := cProd;
    sgProds.Cells[1,l] := xProd;
    sgProds.Cells[2,l] := uCom;
    sgProds.Cells[3,l] := qCom;
    sgProds.Cells[4,l] := vUnCom;
    sgProds.Cells[5,l] := vProd;

    DataModule1.zqInsertXML.Close;
    DataModule1.zqInsertXML.SQL.Clear;
    DataModule1.zqInsertXML.SQL.Add('INSERT INTO xmlprod(cProd, xProd, uCom, qCom, ' + 'vUnCom, vProd, chval)');
    DataModule1.zqInsertXML.SQL.Add('VALUES (:pcProd, :pxProd, :puCom, :pqCom, ' + ':pvUnCom, :pvProd, :pchval)');
    DataModule1.zqInsertXML.ParamByName('pcProd').AsString := cProd;
    DataModule1.zqInsertXML.ParamByName('pxProd').AsString := xProd;
    DataModule1.zqInsertXML.ParamByName('puCom').AsString := uCom;
    DataModule1.zqInsertXML.ParamByName('pqCom').AsString := qCom;
    DataModule1.zqInsertXML.ParamByName('pvUnCom').AsString := Trcpv(vUnCom);
    DataModule1.zqInsertXML.ParamByName('pvProd').AsString := Trcpv(vProd);
    DataModule1.zqInsertXML.ParamByName('pchval').AsString := cnpj+fone;
    DataModule1.zqInsertXML.ExecSQL;

    xmlNCab := xmlNCab.NextSibling;
end;  

This code above is just a small continuation of the answer to this previously asked question: Access Violation When Selecting XML File - Nfe

And I believe the error is in this while, because it selects my xml items, however, when it has only one item, it selects more than necessary, ie, adds somehow, empty items.

Here’s a picture of what happened: inserir a descrição da imagem aqui

Any idea?

1 answer

1


Eventually I found out for myself.

Follows the code:

// Leitura Dados Itens da Nota Fiscal...
  // Aqui eu peço para encontrar a primeira ocorrencia da Tag <det>>
  xmlNCab := NoPrinc.ChildNodes.FindNode('det');
  // Posiciona o primeiro elemento encontrado
  xmlNCab.ChildNodes.First;
  repeat
    // referencia a tag <prod> dentro de <det>
    xmlNItm := xmlNCab.ChildNodes['prod'];
    xmlNItm.ChildNodes.First;

    inc(l);
    sgProds.RowCount := l;

    repeat
      if xmlNItm.ChildNodes['xProd'].text <> ''
      then
      begin
        cProd := xmlNItm.ChildNodes['cProd'  ].Text; // Código do produto CFOP
        xProd := xmlNItm.ChildNodes['xProd'  ].Text; // Nome do produto
        uCom := xmlNItm.ChildNodes['uCom'    ].Text; // Sigla unidade da embalagem
        qCom := xmlNItm.ChildNodes['qCom'    ].Text; // Quantidade do produto (4dec,S/M)
        vUnCom := xmlNItm.ChildNodes['vUnCom'].Text; // Valor unitário do produto (4dec,S/M)
        vProd := xmlNItm.ChildNodes['vProd'  ].Text; // Valor total do produto (
        //2dec,S/M)

        sgProds.Cells[0,l] := cProd;
        sgProds.Cells[1,l] := xProd;
        sgProds.Cells[2,l] := uCom;
        sgProds.Cells[3,l] := qCom;
        sgProds.Cells[4,l] := vUnCom;
        sgProds.Cells[5,l] := vProd;

        DataModule1.zqInsertXML.Close;
        DataModule1.zqInsertXML.SQL.Clear;
        DataModule1.zqInsertXML.SQL.Add('INSERT INTO xmlprod(cProd, xProd, uCom, qCom, ' +
          'vUnCom, vProd, chval)');
        DataModule1.zqInsertXML.SQL.Add('VALUES (:pcProd, :pxProd, :puCom, :pqCom, ' +
          ':pvUnCom, :pvProd, :pchval)');
        DataModule1.zqInsertXML.ParamByName('pcProd').AsString := cProd;
        DataModule1.zqInsertXML.ParamByName('pxProd').AsString := xProd;
        DataModule1.zqInsertXML.ParamByName('puCom').AsString := uCom;
        DataModule1.zqInsertXML.ParamByName('pqCom').AsString := qCom;
        DataModule1.zqInsertXML.ParamByName('pvUnCom').AsString := Trcpv(vUnCom);
        DataModule1.zqInsertXML.ParamByName('pvProd').AsString := Trcpv(vProd);
        DataModule1.zqInsertXML.ParamByName('pchval').AsString := cnpj+fone;
        DataModule1.zqInsertXML.ExecSQL;
      end;

      xmlNItm := xmlNItm.NextSibling;
    until xmlNItm = nil;
    xmlNCab := xmlNCab.NextSibling;
  until xmlNCab = nil;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.