DGBRID - E POSSIVEL FORMATAR DADOS COM SQL?
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
é 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
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
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:
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:
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
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