update processo setstatus=´R´ where ??????
Amigos, sou novato no delphi e estou com um problema.
Tenho um formulário para inserir dados na tabela HISTORICO com os campos:
Tipo de Movimentação (COMBO)
Data (DBDataEdit)
Nome (Dblookupcombobox q traz os nomes da tabela PROCESSO)
Obs(DBMemo)
A questão é que conforme o ´Tipo de Movimentação´ (recebido=R ou devolvido=D), tenho que mudar o campo ´Status´ da tabela PROCESSO para ´R´ ou ´D´ no registro escolhido no dblookup.
Estou tentando fazer o update mas na hora do where estou me perdendo.
DataModule2.ADOQAlteraStatus.Close;
DataModule2.ADOQAlteraStatus.SQL.Clear;
DataModule2.ADOQAlteraStatus.SQL.Add(´UPDATE PROCESSO SET STATUS=´´R´´´);
DataModule2.ADOQAlteraStatus.SQL.Add(´WHERE PROCESSO.NOME=??????????´);
DataModule2.ADOQAlteraStatus.Open;
DataModule2.ADOQAlteraStatus.Active:=True;
Ajudem-me
Tenho um formulário para inserir dados na tabela HISTORICO com os campos:
Tipo de Movimentação (COMBO)
Data (DBDataEdit)
Nome (Dblookupcombobox q traz os nomes da tabela PROCESSO)
Obs(DBMemo)
A questão é que conforme o ´Tipo de Movimentação´ (recebido=R ou devolvido=D), tenho que mudar o campo ´Status´ da tabela PROCESSO para ´R´ ou ´D´ no registro escolhido no dblookup.
Estou tentando fazer o update mas na hora do where estou me perdendo.
DataModule2.ADOQAlteraStatus.Close;
DataModule2.ADOQAlteraStatus.SQL.Clear;
DataModule2.ADOQAlteraStatus.SQL.Add(´UPDATE PROCESSO SET STATUS=´´R´´´);
DataModule2.ADOQAlteraStatus.SQL.Add(´WHERE PROCESSO.NOME=??????????´);
DataModule2.ADOQAlteraStatus.Open;
DataModule2.ADOQAlteraStatus.Active:=True;
Ajudem-me
Edilsonlima
Curtidas 0
Respostas
.lg.
17/06/2009
seguinte... seria mais facil se você deixasse a query ja escrita no ADOQuery. e trabalhasse com parâmetros.
sua tabela de histórico deve ter um campo ´código´.
A condição será apenas para identificar qual dos registros vc estará alterando o status pra um novo valor. Sua query ficaria assim dentro do ADOQuery:
Onde na query seus parâmetros serão:
- ´:VALOR´ = Seria o ´R´ ou o ´D´, isso é passado para o parâmetro, logo falarei como.
- ´:CODIGO´ = O código referente a aquele registro. Como eu falei todo registro tem um identificador para que você possa tratar os registros.
Antes de lhe falar como passar os parâmetros... 2 observações:
1. Na query, quando você chama a tabela (UPDATE [b:23e7a82d86]PROCESSO[/b:23e7a82d86]...), você não precisa identificar o campo seguido da tabela ([b:23e7a82d86]PROCESSO.NOME[/b:23e7a82d86]), a query já entende que o campo ´nome´ pertence a aquela tabela do update que você está dando. Agora é so um conselho. Cada um programa de uma maneira, você pode usar, ou não.
2. Quando você dá um ´.open´ num ADOQuery, você está ativando ela. Ou seja...
Para se passar os parâmetros... com o seu ADOQuery já com o SQL definido dentro dele, seu código ficaria assim:
Lembre-se que onde eu escrevi ´IdentificadorDoRegistro´, é o identificador que diz, ´A registro da tabela tal que você quer é este!´. Entende!?
Qualquer dúvida pode perguntar.
Espero que ajude.
Att,
.lg.
sua tabela de histórico deve ter um campo ´código´.
A condição será apenas para identificar qual dos registros vc estará alterando o status pra um novo valor. Sua query ficaria assim dentro do ADOQuery:
UPDATE PROCESSO SET STATUS = :VALOR WHERE CODIGO = :CODIGO
Onde na query seus parâmetros serão:
- ´:VALOR´ = Seria o ´R´ ou o ´D´, isso é passado para o parâmetro, logo falarei como.
- ´:CODIGO´ = O código referente a aquele registro. Como eu falei todo registro tem um identificador para que você possa tratar os registros.
Antes de lhe falar como passar os parâmetros... 2 observações:
1. Na query, quando você chama a tabela (UPDATE [b:23e7a82d86]PROCESSO[/b:23e7a82d86]...), você não precisa identificar o campo seguido da tabela ([b:23e7a82d86]PROCESSO.NOME[/b:23e7a82d86]), a query já entende que o campo ´nome´ pertence a aquela tabela do update que você está dando. Agora é so um conselho. Cada um programa de uma maneira, você pode usar, ou não.
2. Quando você dá um ´.open´ num ADOQuery, você está ativando ela. Ou seja...
DataModule2.ADOQAlteraStatus.Active:=True;
Esta linha é inutil. :wink: Para se passar os parâmetros... com o seu ADOQuery já com o SQL definido dentro dele, seu código ficaria assim:
with DataModule2 do begin ADOQAlteraStatus.Close; ADOQAlteraStatus.Parameters.ParamByName(´VALUE´).Value := ´R´;//poderia fazer uma validação para passar R ou D pelo que vc mencionou ADOQAlteraStatus.Parameters.ParamByName(´CODIGO´).Value = IdentificadorDoRegistro; ADOQAlteraStatus.Open; end;
Lembre-se que onde eu escrevi ´IdentificadorDoRegistro´, é o identificador que diz, ´A registro da tabela tal que você quer é este!´. Entende!?
Qualquer dúvida pode perguntar.
Espero que ajude.
Att,
.lg.
GOSTEI 0
Edilsonlima
17/06/2009
Caro .lg., obrigado pela ajuda.
continuo sem enteder muito bem e fiz várias tentativas de várias formas com base no que vc postou.
Realmente a tabela HISTORICO tem um campo ´COD_PROCESSO´ que se relaciona com o campo, de mesmo nome, da tabela PROCESSO.
gostaria que o amigo verificasse, pois está assim:
SQL na ADOQAlteraStaus
UPDATE PROCESSO
SET STATUS = ´R´
WHERE CODIGO COD_PROCESSO = COD_PROCESSO ??????
e no botão gravar
.....
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ´COD_PROCESSO´;
ADOQAlteraStatus.Open;
end
Aguardo resposta e desde já agradeço
continuo sem enteder muito bem e fiz várias tentativas de várias formas com base no que vc postou.
Realmente a tabela HISTORICO tem um campo ´COD_PROCESSO´ que se relaciona com o campo, de mesmo nome, da tabela PROCESSO.
gostaria que o amigo verificasse, pois está assim:
SQL na ADOQAlteraStaus
UPDATE PROCESSO
SET STATUS = ´R´
WHERE CODIGO COD_PROCESSO = COD_PROCESSO ??????
e no botão gravar
.....
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ´COD_PROCESSO´;
ADOQAlteraStatus.Open;
end
Aguardo resposta e desde já agradeço
GOSTEI 0
.lg.
17/06/2009
É... você é meio que novato no assunto. Lhe recomendo depois pegar alguma apostila de SQL basico para dar uma lida.
vamos aos fatos:
- Todo parâmetro é definido com [b:bd4f1d0f95]dois pontos ( : )[/b:bd4f1d0f95]. Você define um parâmetro para passar um valor no lugar dele. ex.:
- No seu código... seu update ficaria assim:
Note que coloquei ´[b:bd4f1d0f95]:[/b:bd4f1d0f95]´ no COD_PROCESSO, pois ele devo dizer que vai receber um valor.
- No script, So passe valor para parâmetros que foram definidos. No seu componente ADOQuery, você pode verificar quantos parâmetros existem, ao clicar 2x na propriedade (do objectInspector) [b:bd4f1d0f95]Parameters[/b:bd4f1d0f95]. Irá abrir uma caixinha lhe mostrando os parâmetros existentes. [color=red:bd4f1d0f95]OBS.: Não mude nenhum valor deles nessa telinha. Apenas visualize.[/color:bd4f1d0f95]
- Se você quer não for validar e for deixar o select já com a atribuição [color=blue:bd4f1d0f95]R[/color:bd4f1d0f95] para o campo status, então use a query que coloquei acima. Se você for validar como você mesmo fez no seu script:
[color=orange:bd4f1d0f95]Obs.: Use[/color:bd4f1d0f95] [color=green:bd4f1d0f95]then[/color:bd4f1d0f95] [color=orange:bd4f1d0f95]para executar uma linha apos a condição. Use[/color:bd4f1d0f95] [color=green:bd4f1d0f95]then begin[/color:bd4f1d0f95] [color=orange:bd4f1d0f95]para executar varias linhas apos a condição.[/color:bd4f1d0f95]
Então use este script:
E esta query:
LEMBRANDO: so porque eu coloquei [color=red:bd4f1d0f95]ADOQueryCOD_PROCESSO.Value[/color:bd4f1d0f95], não significa que você vai colocar isso não. Você deve procurar em qual query ou em qual variável está armazenado o valor do código do registro da tabela [color=blue:bd4f1d0f95]PROCESSO[/color:bd4f1d0f95] que você quer que altere.
E mais uma vez: Pegue uma apostila de SQL básico e faça mais treinos em delphi. Você está precisando de alguns treinamentos. tem muito erro de sintax no seu código e linha atoa. Falo isso por bem.
Qualquer coisa basta falar que ajudamos.
Abraços,
.lg.
vamos aos fatos:
- Todo parâmetro é definido com [b:bd4f1d0f95]dois pontos ( : )[/b:bd4f1d0f95]. Você define um parâmetro para passar um valor no lugar dele. ex.:
:CODIGO
- No seu código... seu update ficaria assim:
UPDATE PROCESSO SET STATUS = ´R´ WHERE COD_PROCESSO = :COD_PROCESSO
- No script, So passe valor para parâmetros que foram definidos. No seu componente ADOQuery, você pode verificar quantos parâmetros existem, ao clicar 2x na propriedade (do objectInspector) [b:bd4f1d0f95]Parameters[/b:bd4f1d0f95]. Irá abrir uma caixinha lhe mostrando os parâmetros existentes. [color=red:bd4f1d0f95]OBS.: Não mude nenhum valor deles nessa telinha. Apenas visualize.[/color:bd4f1d0f95]
- Se você quer não for validar e for deixar o select já com a atribuição [color=blue:bd4f1d0f95]R[/color:bd4f1d0f95] para o campo status, então use a query que coloquei acima. Se você for validar como você mesmo fez no seu script:
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
Então use este script:
with DataModule2 do begin if (Trim(DbLooupCmbBoxMovimentacao.Text) = ´RECEBIDO´) then begin ADOQAlteraStatus.Close; ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´; ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQueryCOD_PROCESSO.Value; ADOQAlteraStatus.Open; end else if (Trim(DbLooupCmbBoxMovimentacao.Text) = ´DEVOLVIDO´) then begin ADOQAlteraStatus.Close; ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´D´; ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQueryCOD_PROCESSO.Value; ADOQAlteraStatus.Open; end; end;
E esta query:
UPDATE PROCESSO SET STATUS = :STATUS WHERE COD_PROCESSO = :COD_PROCESSO
LEMBRANDO: so porque eu coloquei [color=red:bd4f1d0f95]ADOQueryCOD_PROCESSO.Value[/color:bd4f1d0f95], não significa que você vai colocar isso não. Você deve procurar em qual query ou em qual variável está armazenado o valor do código do registro da tabela [color=blue:bd4f1d0f95]PROCESSO[/color:bd4f1d0f95] que você quer que altere.
E mais uma vez: Pegue uma apostila de SQL básico e faça mais treinos em delphi. Você está precisando de alguns treinamentos. tem muito erro de sintax no seu código e linha atoa. Falo isso por bem.
Qualquer coisa basta falar que ajudamos.
Abraços,
.lg.
GOSTEI 0
Edilsonlima
17/06/2009
Caro .lg.,
Espero q vc não se zangue comigo, mas continuo com problema. Realmente tenho que estudar mais (aceito sugestão de apostilas caso tenha alguma). Por enquanto, caso o amigo, ainda esteja disposto aa juadar. Fiz exatamente como vc disse e esclareço:
realmente na caixinha de parameters da ADOQAlteraStatus, aparece
STATUs e COD_PROCESSO
pois a SQL coloquei exatamente como vc disse.
O código ficou assim:
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
begin
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
ADOQAlteraStatus.Open;
end
else
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´DEVOLVIDO´) then
begin
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´D´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoNOME.Value;
ADOQAlteraStatus.Open;
end
end
e na execução quando clico no botão gravar, retorna a mensagem:
´O procedor atual não oferece suporte para retornar vários conjuntos de registros de uma única execução´.
Espero ajuda e desde já agradeço.
Espero q vc não se zangue comigo, mas continuo com problema. Realmente tenho que estudar mais (aceito sugestão de apostilas caso tenha alguma). Por enquanto, caso o amigo, ainda esteja disposto aa juadar. Fiz exatamente como vc disse e esclareço:
realmente na caixinha de parameters da ADOQAlteraStatus, aparece
STATUs e COD_PROCESSO
pois a SQL coloquei exatamente como vc disse.
O código ficou assim:
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
begin
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
ADOQAlteraStatus.Open;
end
else
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´DEVOLVIDO´) then
begin
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´D´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoNOME.Value;
ADOQAlteraStatus.Open;
end
end
e na execução quando clico no botão gravar, retorna a mensagem:
´O procedor atual não oferece suporte para retornar vários conjuntos de registros de uma única execução´.
Espero ajuda e desde já agradeço.
GOSTEI 0
Edilsonlima
17/06/2009
havia esquecido de citar que fiquei na dúvida, quanto a query a utilizar na linha
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := [b:06165e3f4c]ADOQNomeProcessoCOD_PROCESSO[/b:06165e3f4c].Value;
coloquei a query acima, pois foi com ela que extrair os nomes para o dblookup, mesmo assim já que pretendo é modificar o campo STATUS da tabela Processo, substiuir por [b:06165e3f4c]ADOTProcessoCOD_PROCESSO[/b:06165e3f4c].
Executei das duas formas e mesmo assim...
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := [b:06165e3f4c]ADOQNomeProcessoCOD_PROCESSO[/b:06165e3f4c].Value;
coloquei a query acima, pois foi com ela que extrair os nomes para o dblookup, mesmo assim já que pretendo é modificar o campo STATUS da tabela Processo, substiuir por [b:06165e3f4c]ADOTProcessoCOD_PROCESSO[/b:06165e3f4c].
Executei das duas formas e mesmo assim...
GOSTEI 0
.lg.
17/06/2009
substiuir por ADOTProcessoCOD_PROCESSO.
Acredito que este seja o campo que você deve colocar. Olhou certo. Pelo nome eu suponho que seja.
Vamos fazer uma substituição de componentes...
Pegue a query (copie). Exclua o componente ADOQuery que você colocou pra isso. Normalmente, para [color=blue:309adfdfa1]UPDATE[/color:309adfdfa1], [color=blue:309adfdfa1]INSERT[/color:309adfdfa1] e [color=blue:309adfdfa1]DELETE[/color:309adfdfa1] eu costumo usar o componente [color=darkblue:309adfdfa1]ADOCommand[/color:309adfdfa1].
A única coisa que muda dele pro query, é que aonde você coloca a query é na propriedade [b:309adfdfa1]CommandText[/b:309adfdfa1].
E no script substitua o ADOQuery por ADOCommand (no caso seria o nome que vc vai da pra ele.) Command não precisa dos commandos [b:309adfdfa1]Close;[/b:309adfdfa1] e [b:309adfdfa1]Open;[/b:309adfdfa1]
ex.:
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´R´; //E assim vai quantos parâmetros tiver. //e pra executar use: acmUpdProcesso.Execute;
É até mais simples.
Qualquer dúvida, pode perguntar.
.lg.
GOSTEI 0
Edilsonlima
17/06/2009
Caro .lg.,
Fiz exatamente como vc disse.
Coloquei o ADOCommand, passei a SQL da Query anterior para ele na propriedade Command text e verifiquei a propriedade parameters e na janela mosta os parametros STATUS e COD_Processo
No código ficou assim:
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then begin
acmUpdProcesso.Parameters.ParamByName(´STATUS´).Value := ´R´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOTProcessoSTATUS.Value;
acmUpdProcesso.Execute;
end else
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´DEVOLVIDO´) then begin
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´D´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOTProcessoSTATUS.Value;
acmUpdProcesso.Execute;
end;
Agora qdo executo não aparece erro algum, porém o STATUS na tabela PROCESSO fica inalterado.
o que será q tá errado desta vez?
Fiz exatamente como vc disse.
Coloquei o ADOCommand, passei a SQL da Query anterior para ele na propriedade Command text e verifiquei a propriedade parameters e na janela mosta os parametros STATUS e COD_Processo
No código ficou assim:
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then begin
acmUpdProcesso.Parameters.ParamByName(´STATUS´).Value := ´R´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOTProcessoSTATUS.Value;
acmUpdProcesso.Execute;
end else
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´DEVOLVIDO´) then begin
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´D´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOTProcessoSTATUS.Value;
acmUpdProcesso.Execute;
end;
Agora qdo executo não aparece erro algum, porém o STATUS na tabela PROCESSO fica inalterado.
o que será q tá errado desta vez?
GOSTEI 0
.lg.
17/06/2009
Tem como vc explicar melhor esse [b:68b9962cf6]inalterado[/b:68b9962cf6]?
Você pode dar um update novamente que vai funcionar.
Um conselho:
Abra o SQL management e use a interface do sql para testar as sentenças sql antes de usa-las. isso lhe ajuda a ver se o sql está correto ou errado. Se vai dar certo ou não. Lembrando que no studio do SQL... as query´s não entendem parâmetros, então troque os parâmetros pelos seus respectivos valores.
Lembre-se... Apenas para teste. O melhor seria se vc criasse uma base identica a que vc está usando na aplicação, na sua máquina local. Assim você não altera diretamente no banco de dados do servidor.
Aguardo retorno.
.lg.
Você pode dar um update novamente que vai funcionar.
Um conselho:
Abra o SQL management e use a interface do sql para testar as sentenças sql antes de usa-las. isso lhe ajuda a ver se o sql está correto ou errado. Se vai dar certo ou não. Lembrando que no studio do SQL... as query´s não entendem parâmetros, então troque os parâmetros pelos seus respectivos valores.
Lembre-se... Apenas para teste. O melhor seria se vc criasse uma base identica a que vc está usando na aplicação, na sua máquina local. Assim você não altera diretamente no banco de dados do servidor.
Aguardo retorno.
.lg.
GOSTEI 0
Edilsonlima
17/06/2009
.Ig. , consegui fazer a coisa funcionar e ficou assim:
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then begin
acmUpdProcesso.Parameters.ParamByName(´STATUS´).Value := ´R´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
acmUpdProcesso.Execute;
end else
begin
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´D´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
acmUpdProcesso.Execute;
end;
Muito obrigado pela ajuda..
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then begin
acmUpdProcesso.Parameters.ParamByName(´STATUS´).Value := ´R´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
acmUpdProcesso.Execute;
end else
begin
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´D´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
acmUpdProcesso.Execute;
end;
Muito obrigado pela ajuda..
GOSTEI 0
.lg.
17/06/2009
Qualquer dúvida... volte a perguntar.
Abraços,
.LG.
Abraços,
.LG.
GOSTEI 0