Fórum update processo setstatus=´R´ where ?????? #371331

17/06/2009

0

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


Edilsonlima

Edilsonlima

Responder

Posts

18/06/2009

.lg.

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:
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.


Responder

Gostei + 0

18/06/2009

Edilsonlima

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


Responder

Gostei + 0

19/06/2009

.lg.

É... 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.:
:CODIGO

- No seu código... seu update ficaria assim:
UPDATE PROCESSO
   SET STATUS = ´R´
 WHERE COD_PROCESSO = :COD_PROCESSO
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:
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
[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:
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.


Responder

Gostei + 0

19/06/2009

Edilsonlima

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.


Responder

Gostei + 0

19/06/2009

Edilsonlima

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...


Responder

Gostei + 0

19/06/2009

.lg.

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.


Responder

Gostei + 0

20/06/2009

Edilsonlima

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?


Responder

Gostei + 0

22/06/2009

.lg.

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.


Responder

Gostei + 0

23/06/2009

Edilsonlima

.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..


Responder

Gostei + 0

24/06/2009

.lg.

Qualquer dúvida... volte a perguntar.
Abraços,
.LG.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar