DGBRID - E POSSIVEL FORMATAR DADOS COM SQL?

USUARIO.EXCLUIDOS 02/10/2006 10:36:23
#174938
Bom dia!
é o seguinte, não consigo formatar os dados tipo número que são exibidos na DBGrid. Este é o cenário:
- Estou utilizando DAO com banco de dados ACCESS, um DBGrid (que chamei de dbgrdCustos) e um Controle DATA (que chamei de dtaCustos).

Existe um formulário principal (frmPrincipal) onde existem 3 ComboBox (Cliente, OS e Evento). Selecionando o cliente, aparecem somente as OSÂÂÂ's deste cliente na ComboBox OS. E selecionando uma dessas OSÂÂÂ's, aparecem somente os Eventos desta OS na ComboBox Evento. Ao clicar em algum evento, o ID desse evento é guardado em uma variável (varIDEvent).
Ao clicar em OK, é carregado outro formulário (frmCustos) onde existe a DBGrid + o controle DATA. E no Load deste formulário existe o código abaixo, responsável pelo preenchimento da DBGrid:

(OBS: tem como postar códigos de uma maneira específica, ou posso postar assim mesmo?? Obrigado!)

dtaCustos.RecordSource = ("SELECT Pedido,NF,Data,Valor,PerICMS,ICMS,PerIPI,IPI,Fornec,Obs " & _
"FROM ((tblFornec INNER JOIN tblDados " & _
"ON tblFornec.IDFrnc = tblDados.IDFornec) " & _
"INNER JOIN tblEvento " & _
"ON tblDados.IDEvento = tblEvento.IDEvent) " & _
"WHERE IDEvento = " & " " & frmPrincipal.VarIDEvent & " " & _
"ORDER BY Data ")

Ou seja, o RecordSource do controle DATA é a instrução SQL acima, onde só quero que sejam exibidos os eventos de uma determinada OS de um determinado cliente. Reparem que na cláusula ("WHERE IDEvento = " & " " & frmPrincipal.VarIDEvent & " )
é que uso o valor do ID clicado na combobox do frmPricipal.

Desculpem escrever tanto, mas até aqui está tudo certo. A DBGrid faz exatamente o que eu quero (exibir o resultado conforme a instrução SQL).

Mas o problema é que não consigo formatar os dados exibidos na DBGrid.

O que eu tentei fazer para resolver o problema:
- A instrução SQL traz/cria as colunas automaticamente. Mas sempre serão 10 colunas. Usei a opção EDIT e inseri o mesmo número de colunas que a instrução SQL cria, mas quando executo o código, tudo fica em branco. A quantidade de linhas até aparece na tela, mas tudo em branco. Linhas e colunas em branco, sem informações e não é gerado nenhum erro.
Não consigo usar: Properties > Columns >Number Format, pois a propriedade(?) RecordSource do controle Data está em branco, pois é preenchida pelo código acima.
- Tentei também usar o controle Adodc com DataGrid no lugar de controle DATA com DBGGrid, pois nas propriedades do componente DataGrid existe uma opção "Format".
Pois bem, fiz isso. Mas tive que usar o DataEnvironment para poder mecher das propriedades do DataGrid. Deu certo até certo ponto porque eu consigui exibir os dados formatados, mas não consegui mais usar a variável VarIDEvent (vinda do clique da combobox Evento do frmPrincipal). Não consegui usá-la porque o código SQL fica dentro do DataEnvironment e EU ACHO que lá ele não considera variáveis. Pelo menos eu tentei e não consegui. Então não consigo exibir APENAS os eventos que eu quero.

Resumindo, esse é o problema:
- Se eu quiser usar uma variável para resgatar do banco de dados apenas as informações necessárias, eu não consigo formatar a DBGrid.
- Se eu uso o DataGrid, não cosigo usar a variável para interagir com o clique do usuário vindo de um formulário.

As minhas perguntas:
- Isso tem sentido? Fiz alguma besteira?
- Existe a possibilidade do DataEnvironment reconhecer, no código SQL, que eu preciso de uma variável??

Já tentei de várias maneiras, pesquisei bastante, mas não acho nada que una DAO + DBGrid + Preenchimento da DBGrid com SQL usando uma variável.

Obrigado!!

Flávio
USUARIO.EXCLUIDOS 02/10/2006 12:10:06
#174981
Resposta escolhida
Citação:

(OBS: tem como postar códigos de uma maneira específica, ou posso postar assim mesmo?? Obrigado!)



Pode postar assim, mas se usar a ferramenta código () fica mais organizado...

E qto à  sua dúvida, se foi o que eu entendi, vc pode usar o Format dentro da clausula, exemplo:

dtaCustos.RecordSource = ("SELECT Format(Pedido, "#000000") As Pedido,Format(NF, "#00000") As NF,Data,Format(Valor, "Currency"),Format(PerICMS, "#0.00") & "%" As PercICMS,Format(ICMS, "Currency") As ICMS,Format(PerIPI, "#0.00") & "%" As PerIPI,Format(IPI, "Currency") As IPI,Fornec,Obs " & _
"FROM ((tblFornec INNER JOIN tblDados " & _
"ON tblFornec.IDFrnc = tblDados.IDFornec) " & _
"INNER JOIN tblEvento " & _
"ON tblDados.IDEvento = tblEvento.IDEvent) " & _
"WHERE IDEvento = " & " " & frmPrincipal.VarIDEvent & " " & _
"ORDER BY Data ")


Não sei se a formatação que pus era como queria, vc pode modificar, qualquer dúvida poste...flw
USUARIO.EXCLUIDOS 02/10/2006 12:51:47
#174994
Valeu MATIOLI, mas não funcionou. Acontece sempre um erro na cláusula SQL. Aqueles erros de quando tem algum erro de digitação no SQL.

Recebi algumas dicas de amigos e consegui fazer. Agora consigo exibir as informações formatadas. Os procedimentos são os seguintes:

- Usei o controle Adodc com DataGrid. Assim consigo editar o DataGrid e escolher o tipo de formato. Eu até sabia disso antes, mas o problema é que o código SQL inserido na propriedade RecrodSource do controle Adodc, provavelmente NÃO suporta códigos com variáveis (pelo menos eu não consegui fazer).
Sendo assim eu coloquei na propriedade RecordSource do Adodc o seguinte SQL:

SELECT Pedido,NF,Data,Valor,PerICMS,ICMS,PerIPI,IPI,Fornec,Obs FROM ((tblFornec INNER JOIN tblDados ON tblFornec.IDFrnc = tblDados.IDFornec) INNER JOIN tblEvento ON tblDados.IDEvento = tblEvento.IDEvent)

Então na inicialização do outro formulário, retornava para o controle DataGrid TODOS os eventos de TODOS os clientes. E isso é o que eu NÃO queria. Queria apenas os eventos de um cliente, que foi selecionado na combobox do formulário principal.

A solução:
Como o controle Adodc não pode ficar em branco, deixei o código SQL citado acima na propriedade RecordSource dele. Mesmo retornando todos os clientes... MAS! Coloquei ainda na inicialização do formulário o mesmo código + a cláusula WHERE que seleciona somente os clientes que eu quero. Desse jeito:


adodcCustos.RecordSource = ("SELECT Pedido,NF,Data,Valor,PerICMS,ICMS,PerIPI,IPI,Fornec,Obs " & _
"FROM ((tblFornec INNER JOIN tblDados " & _
"ON tblFornec.IDFrnc = tblDados.IDFornec) " & _
"INNER JOIN tblEvento " & _
"ON tblDados.IDEvento = tblEvento.IDEvent) " & _
"WHERE IDEvento = " & " " & frmPrincipal.VarIDEvent & " " & _
"ORDER BY Data ")

adodcCustos.Refresh


Lembrando que tem que colocar o comando adodcCustos.Refresh para atualizar o controle Adodc.

Bingo! Os problemas acabaram!

Na verdade na propriedade RecorSource do controle Adodc não precisava colocar aquele código todo. Era só colocar alguma coisa para que a propriedade RecordSource do controle Adodc não ficasse em branco. Se ficar em branco dá erro.
O importante é preencher corretamente a útima citação SQL acima. Onde a propriedade RecordSource que foi definida em tempo de projeto, é substituída, em tempo de execução, que foi definida no Load do formulário.

Obrigado à  tds!! Perdi muitos cabelos com isso, mas valeu a pena!!

[ ]ÂÂÂ's
Tópico encerrado , respostas não são mais permitidas