Inserção de dados

15/09/2004

Srs, na rotina abaixo, ao selecionar um produto para criar o certificado o sistema tem que fazer algumas atribuições e também inserir automaticamente no ´grid - Itens de controle do certificado´ todos os valores da tabela itens de controle do produto que é uma tabela ´filha´ da tabela produtos. Neste caso, estou passando como parâmetro para abertura do cds_itensdecontrole o codigo do produto que estou selecionando. Ao selecionar um produto e tentar inserir (click do botão ok) o delphi me exibe a seguinte mensagem de erro: ´SQLDA missing or incorrect version, or incorrect number/type of variables´. O programa compila sem nehum erro, mas está apresentando erros na execução. Solicito então encarecidamente a ajuda de vcs para tentar entender e resolver este erro.

Desde já, agradeço a todos vcs.

ps.: Utilizo Delphi7 + Firebird1.5 + DBExpress( Sqldataset, datasetprovider, clientdataset e sqlclientdataset).

[color=darkred:42b428e5da]//rotina

procedure TfrmCertificado.btn_setorClick(Sender: TObject);
begin
inherited;
if Dts.State=dsinactive then
begin
MessageDlg(´Oh! meu Deus, USUARIO COM PROBLEMA DE B-I-O-S !!!É preciso adicionar um novo, ou abrir um certificado antes de continuar!!!´,mtinformation,[mbok],0);
exit;
end;
frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert);
frmLocalizar.btn_procurar.Click;
try
if Frmlocalizar.ShowModal=mrOk then
begin
if Dts.State=dsbrowse then
dmdados.cds_certificados.Edit;
dmdados.cds_certificadosPRODUTO.AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_certificadosDESENHO.AsString:=dmdados.sqlcds_procura_prodcertDESENHO.AsString;
dmdados.cds_certificadosNOME_PRODUTO.AsString:=dmdados.sqlcds_procura_prodcertDESCRICAO.AsString;
dmdados.cds_certificadosMATPRIMA.AsInteger:=dmdados.sqlcds_procura_prodcertMATPRIMA.AsInteger;
dmdados.cds_certificadosNOME_MATERIAPRIMA.AsString:=dmdados.sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString;
dmdados.cds_certificadosCLIENTE.AsInteger:=dmdados.sqlcds_procura_prodcertCLIENTE.AsInteger;
dmdados.cds_certificadosNOME_CLIENTE.AsString:=dmdados.sqlcds_procura_prodcertNOME_CLIENTE.AsString;
end;
// rotina para inserir itens de controle do certificado
dmdados.cds_itensdecontrole.Close;
dmdados.cds_itensdecontrole.Params[1].AsInteger:=dmdados.cds_certificadosPRODUTO.AsInteger;
dmdados.cds_itensdecontrole.Open;
While not dmdados.cds_itensdecontrole.Eof do
begin
dmdados.cds_itenscertificado.Close;
dmdados.cds_itenscertificado.Open;
dmdados.cds_itenscertificado.Insert;
dmdados.cds_itenscertificadoCODIGO.Value:=dmdados.cds_itensdecontroleCODIGO.Value;
dmdados.cds_itenscertificadoPRODUTO.Value:=dmdados.cds_itensdecontrolePRODUTO.Value;
dmdados.cds_itenscertificadoCARACTERISTICA.Value:=dmdados.cds_itensdecontroleCARACTERISTICA.Value;
dmdados.cds_itenscertificadoESPECIFICACAO.Value:=dmdados.cds_itensdecontroleESPECIFICACAO.value;
dmdados.cds_itenscertificado.Post;
dmdados.cds_itensdecontrole.Next;
end;
dmdados.sqlcds_lista_itensdecontrole.Open;
// fim da rotina acima
finally
dmdados.sqlcds_procura_produtos.close;
Frmlocalizar.Free;
end;
end;

//fim da rotina[/color:42b428e5da]


Programalista

Respostas

15/09/2004

Vinicius2k

Colega,

Neste trecho :
...
// rotina para inserir itens de controle do certificado
...
dmdados.cds_itensdecontrole.Params[1&93;.AsInteger:=dmdados.cds_certificadosPRODUTO.AsInteger;
...


Se este é o único parametro do cds_itenscontrole use :
...Params&91;0&93;.AsInteger...

ou
...Params.ParamByName(´nome_do_parametro´).AsInteger...


[b:b774d27651]Lembre-se ![/b:b774d27651] Os elementos do Array Params (e de quase todos os outros arrays definidos como propriedade) iniciam a contagem em [b:b774d27651]Zero[/b:b774d27651].

Espero ter ajudado...
T+


Responder Citar

15/09/2004

Programalista

Caro Vinicius2K, coloquei o ´nome do parâmetro´ como vc disse, mas o erro continua o mesmo.

Continuo aguardando alguma outra solução.


Responder Citar

15/09/2004

Vinicius2k

Colega,

Que eu saiba, só existem duas possiblidades para este problema, e ambas relacionadas aos parametros, a primeira é seu nome e a segunda seu tipo de dado...
Já que não é a primeira, verifique o tipo de dado da coluna no Banco de Dados e o tipo de dado do parametro... no caso, vc está passando este parametro como [b:216388a3ba]Intege[/b:216388a3ba]r, o [b:216388a3ba]DataType[/b:216388a3ba] deste parametro está definido como [b:216388a3ba]ftInteger[/b:216388a3ba] ?
Faça esta verificação com os demais parametros, se existirem...

T+


Responder Citar

16/09/2004

Programalista

Olá Vinicius, agora acertei o código, e o datatype do parâmetro está realmente como ftInteger. Não estão aparecendo mais nenhum erro, no entanto o resultado esperado não acontece: Desejo que ao selecionar o produto, para gerar um certificado para ele, sejam inseridos no ´grid - itens do certificado´, os itens de controle (da tabela itens de controle) do produto que estou selecionando, mas não está acontecendo nada. Imaginei que fosse apenas na aplicação, mas no banco de dados os dados também não são inseridos. [color=blue:81c24a50e0]Como fazer isto funcionar?[/color:81c24a50e0]


[color=darkred:81c24a50e0]procedure TfrmCertificado.btn_ProdutoClick(Sender: TObject);
begin
inherited;
if Dts.State=dsinactive then
begin
MessageDlg(´É preciso adicionar um novo, ou abrir um certificado antes de continuar!!!´,mtinformation,[mbok],0);
exit;
end;
frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert);
frmLocalizar.btn_procurar.Click;
try
if Frmlocalizar.ShowModal=mrOk then
begin
if Dts.State=dsbrowse then
dmdados.cds_certificados.Edit;
dmdados.cds_certificadosPRODUTO.AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_certificadosDESENHO.AsString:=dmdados.sqlcds_procura_prodcertDESENHO.AsString;
dmdados.cds_certificadosNOME_PRODUTO.AsString:=dmdados.sqlcds_procura_prodcertDESCRICAO.AsString;
dmdados.cds_certificadosMATPRIMA.AsInteger:=dmdados.sqlcds_procura_prodcertMATPRIMA.AsInteger;
dmdados.cds_certificadosNOME_MATERIAPRIMA.AsString:=dmdados.sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString;
dmdados.cds_certificadosCLIENTE.AsInteger:=dmdados.sqlcds_procura_prodcertCLIENTE.AsInteger;
dmdados.cds_certificadosNOME_CLIENTE.AsString:=dmdados.sqlcds_procura_prodcertNOME_CLIENTE.AsString;

// rotina para inserir itens de controle do certificado
dmdados.cds_itensdecontrole.close;
dmdados.cds_itensdecontrole.Params.ParamByName(´PRODUTO´).AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_itensdecontrole.Open;
While not dmdados.cds_itensdecontrole.Eof do
begin
dmdados.cds_itenscertificado.Close;
dmdados.cds_itenscertificado.Open;
dmdados.cds_itenscertificado.insert;
dmDados.cds_itenscertificadoCODIGO.Value:=dmdados.cds_itensdecontroleCODIGO.Value;
dmdados.cds_itenscertificadoCERTIFICADO.Value:=dmDados.cds_certificadosCODIGO.Value;
dmdados.cds_itenscertificadoPRODUTO.Value:=dmdados.cds_itensdecontrolePRODUTO.Value;
dmdados.cds_itenscertificadoCARACTERISTICA.Value:=dmdados.cds_itensdecontroleCARACTERISTICA.Value;
dmdados.cds_itenscertificadoESPECIFICACAO.Value:=dmdados.cds_itensdecontroleESPECIFICACAO.value;
dmdados.cds_itenscertificado.Post;
dmdados.cds_itensdecontrole.Next;
end;
dmdados.sqlcds_lista_itenscertificado.Close;
dmdados.sqlcds_lista_itenscertificado.Params.ParamByName(´PRODUTO´).Value:=dmdados.cds_certificadosPRODUTO.Value;
dmdados.sqlcds_lista_itenscertificado.Open;
// fim da rotina para inserir os itens de controle do certificado

end;
finally
dmdados.sqlcds_procura_produtos.close;
Frmlocalizar.Free;
end;
end;[/color:81c24a50e0]


Responder Citar

16/09/2004

Vinicius2k

Colega,

A princípio, nada me parece de errado nas rotinas de inserção, mas neste trecho :
... 
if Dts.State=dsbrowse then
dmdados.cds_certificados.Edit;
...

Como vc tem várias ações que devem ser tomadas baseadas neste desvio (if) vc precisa delimitá-las com begin...end;

Veja :
procedure TfrmCertificado.btn_ProdutoClick(Sender: TObject);
begin
  inherited;
  if Dts.State=dsinactive then
  begin
    MessageDlg(´É preciso adicionar um novo, ou abrir um certificado antes de   continuar!!!´,mtinformation,[mbok&93;,0);
    exit;
  end;
  frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert);
  frmLocalizar.btn_procurar.Click;
  try
    if Frmlocalizar.ShowModal=mrOk then
      begin
        if Dts.State=dsbrowse then
        begin
          with dmdados do
          begin
            cds_certificados.Edit;
            cds_certificadosPRODUTO.AsInteger:= sqlcds_procura_prodcertCODIGO.AsInteger;
            cds_certificadosDESENHO.AsString:= sqlcds_procura_prodcertDESENHO.AsString;
            cds_certificadosNOME_PRODUTO.AsString:= sqlcds_procura_prodcertDESCRICAO.AsString;
            cds_certificadosMATPRIMA.AsInteger:= sqlcds_procura_prodcertMATPRIMA.AsInteger;
            cds_certificadosNOME_MATERIAPRIMA.AsString:= sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString;
            cds_certificadosCLIENTE.AsInteger:= sqlcds_procura_prodcertCLIENTE.AsInteger;
            cds_certificadosNOME_CLIENTE.AsString:= sqlcds_procura_prodcertNOME_CLIENTE.AsString;
            // rotina para inserir itens de controle do certificado
            cds_itensdecontrole.close;
            cds_itensdecontrole.Params.ParamByName(´PRODUTO´).AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
            cds_itensdecontrole.Open;
            while not cds_itensdecontrole.Eof do
            begin
              cds_itenscertificado.Close;
              cds_itenscertificado.Open;
              cds_itenscertificado.insert;
              cds_itenscertificadoCODIGO.Value:= cds_itensdecontroleCODIGO.Value;
              cds_itenscertificadoCERTIFICADO.Value:= cds_certificadosCODIGO.Value;
              cds_itenscertificadoPRODUTO.Value:= cds_itensdecontrolePRODUTO.Value;
              cds_itenscertificadoCARACTERISTICA.Value:= cds_itensdecontroleCARACTERISTICA.Value;
              cds_itenscertificadoESPECIFICACAO.Value:= cds_itensdecontroleESPECIFICACAO.value;
              cds_itenscertificado.Post;
              cds_itensdecontrole.Next;
            end;
            sqlcds_lista_itenscertificado.Close;
            sqlcds_lista_itenscertificado.Params.ParamByName(´PRODUTO´).Value:= cds_certificadosPRODUTO.Value;
            sqlcds_lista_itenscertificado.Open;
            // fim da rotina para inserir os itens de controle do certificado      
          end;  
        end;
      end;
  finally
    dmdados.sqlcds_procura_produtos.close;
    Frmlocalizar.Free;
  end;
end;


Veja se este é o problema....

:idea: Dica : ao postar um código utilize as tags ...{/code}*
* O correto é [ -- colchetes, mas usei chaves para poder exemplificar...
Usando as tags facilita a vida de quem quer lhe ajudar... :wink:

T+


Responder Citar