Fórum Erro ao gravar no banco de dados #478579
10/05/2014
0
uso SqlConnection->SqlQuery->ClientDataset->DataSource->DataSetProvider
na string da sqlquery abro o banco de dados de ORDEM DE SERVICO e pego o campo NOME de uma outra tabela de CLIENTES, ao tentar alterar uso o seguinte:
if(dm.cdsOs.State <> dsInsert) or (dm.cdsOs.State <> dsEdit) then
dm.cdsOs.Edit;
dm.cdsOs.FieldByName('OS_VALOR').AsFloat:=StrToFloat(edtValor.Text);
dm.cdsOs.Post;
dm.cdsOs.ApplyUpdates(1);
end;
Valdson Silva
Curtir tópico
+ 0Posts
10/05/2014
Felippe Tadeu
Outra coisa é que esse campo unknown pode estar se referenciando a alguma outra tabela que realmente não tenha.
O ideal seria vc estar postando o código para poder te ajudar, pq sem ele seria apenas chutômetro
Gostei + 0
11/05/2014
Valdson Silva
Acontece que se eu eliminar o campo NOME que puxei da tabela de clientes o erro não ocorre e grava normalmente.
Abaixo o código que esta na SQLQUERY
-----------------------------------------------------------------------------------------------------
SELECT A.*, B.NOME
FROM OS A, CLIENTES B
WHERE A.OS_CLIENTE = B.ID_CLIENTE
ORDER BY A.OS_NUMERO
Obs: O erro também não ocorre quando uso APPEND, e somente quando vou alterar dados:
Gostei + 0
11/05/2014
Felippe Tadeu
Tente fazer a seguinte alteração:
1º No SQL utilize somente uma tabela para OS.
2º Se você usa uma outra Query somente para Clientes, caso não tente criar uma e seguir os passos, adicione no ClientDataSet da OS um campo lookup com as propriedades:
KEY Field = OS_Cliente
Data Set = Data set do cliente
Lookup Keys = id_Cliente
Result Field = nome
Continue usando sem o append para testar.
Gostei + 0
11/05/2014
Felippe Tadeu
Gostei + 0
11/05/2014
Valdson Silva
Gostei + 0
11/05/2014
Valdson Silva
Então consegui uma solução com a seguinte instrução SQL
if(btnAlterar.Caption='Alterar Dados') then
dm.qryOs.Close;
dm.qryOs.SQL.Clear;
dm.qryOs.SQL.Add('Update Os Set Os_Valor=:nVar0');
dm.qryOs.SQL.Add('Where Os_Numero='+dm.cdsOsOS_NUMERO');
dm.qryOs.Params[0].AsFloat := StrToFloat(edtValor.Text);
dm.qryOs.ExecSQL;
end;
* Grava os dados - porém da mensagem de que o Cursor Não Retornou a Qry
qryOs - Cursor not returned from query?????????
Gostei + 0
11/05/2014
Valdson Silva
Então consegui uma solução com a seguinte instrução SQL
if(btnAlterar.Caption='Alterar Dados') then
dm.qryOs.Close;
dm.qryOs.SQL.Clear;
dm.qryOs.SQL.Add('Update Os Set Os_Valor=:nVar0');
dm.qryOs.SQL.Add('Where Os_Numero=' + IntToStr(dm.cdsOsOS_NUMERO.AsInteger));
dm.qryOs.Params[0].AsFloat := StrToFloat(edtValor.Text);
dm.qryOs.ExecSQL;
end;
* Grava os dados - porém da mensagem de que o Cursor Não Retornou a Qry
qryOs - Cursor not returned from query?????????
Gostei + 0
11/05/2014
Felippe Tadeu
Gostei + 0
11/05/2014
Valdson Silva
Gostei + 0
12/05/2014
Andreas Aquino
Para utilizar o ClientDataSet com SQL-SELECT's que retornam dados de mais de uma tabela (joins) você deverá alterar a propriedade ProviderFlags dos campos da tabela relacionada, no seu caso seria do campo "NOME", deixando todas as opções como False (pfInUpdate, pfInWhere, pfInKey, pfHidden) neste caso o ClientDataSet conseguirá aplicar a atualização na tabela principal. O inconveniente é que no caso de inserção dos dados via DbGrid, o nome do cliente não será retornado automaticamente, você terá que atualizar este manualmente, ou então abrir e fechar o CDS para que os dados sejam lidos novamente do BD.
Atenciosamente,
Andreas
Gostei + 0
12/05/2014
Felippe Tadeu
Mas se fosse um lookupfield no ClientDataSet iria atualizar automaticamente
Gostei + 0
12/05/2014
Valdson Silva
Gostei + 0
13/05/2014
Andreas Aquino
Gostei + 0
13/05/2014
Felippe Tadeu
Como vc faz nesses casos ?
Gostei + 0
13/05/2014
Wilton Júnior
Tenta e ve o que da.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)