Stored procedure
boa noite
tenho um stored proc no banco sqlserver 2005 que visualiza as entregas feitas pelo motoqueiro em um determinado periodo. La no banco sql o campo datacad e do tipo smalldatetime ou seja data hora
como eu faço no delpi para passar esses trez parametros motoqueiro , dtinicial e dtfinal ?
estou usando um query ,datasetprovider , um clientdataset um datasource e um dbgrid
como ficaria o comando sql da query ?
Carlos Faria
Curtidas 0
Respostas
Silvio Paganini
04/11/2008
begin
with sp_proceduredoBanco do
begin
Parameters.ParamByName(@DAtaIni).VAlue := VariavelDAtaInicial;
Parameters.ParamByName(@DAtaFim).VAlue := VariavelDAtaFinal;
Parameters.ParamByName(@motoqueiro).VAlue := Variavelmotoqueiro ;
ExecProc;
end;
end;
with sp_proceduredoBanco do
begin
Parameters.ParamByName(@DAtaIni).VAlue := VariavelDAtaInicial;
Parameters.ParamByName(@DAtaFim).VAlue := VariavelDAtaFinal;
Parameters.ParamByName(@motoqueiro).VAlue := Variavelmotoqueiro ;
ExecProc;
end;
end;
GOSTEI 0
Silvio Paganini
04/11/2008
Detalhando a resposta anterior!
Você disse que tem a store procedure no Banco que visualiza as entregas feitas pelo motoqueiro em um determinado periodo,
e você quer passar os parametros pelo Delhi 2007. Para passar parametro do Dephi para a sua store procedure do Banco Sql Server
use o componente AdoStoredProc da paleta dbGo. No Delphi ficaria assim:
procedure twebform1...
var
VariavelDAtaInicial : Datetime;
VariavelDAtaFinal : Datetime;
Variavelmotoqueiro : string; begin
with Nome_AdoStoredProc do
begin
Parameters.ParamByName(@DAtaIni).VAlue := VariavelDAtaInicial;
Parameters.ParamByName(@DAtaFim).VAlue := VariavelDAtaFinal;
Parameters.ParamByName(@motoqueiro).VAlue := Variavelmotoqueiro ;
ExecProc;
end;
end;
Você disse que tem a store procedure no Banco que visualiza as entregas feitas pelo motoqueiro em um determinado periodo,
e você quer passar os parametros pelo Delhi 2007. Para passar parametro do Dephi para a sua store procedure do Banco Sql Server
use o componente AdoStoredProc da paleta dbGo. No Delphi ficaria assim:
procedure twebform1...
var
VariavelDAtaInicial : Datetime;
VariavelDAtaFinal : Datetime;
Variavelmotoqueiro : string; begin
with Nome_AdoStoredProc do
begin
Parameters.ParamByName(@DAtaIni).VAlue := VariavelDAtaInicial;
Parameters.ParamByName(@DAtaFim).VAlue := VariavelDAtaFinal;
Parameters.ParamByName(@motoqueiro).VAlue := Variavelmotoqueiro ;
ExecProc;
end;
end;
GOSTEI 0
Guinther Pauli
04/11/2008
Complementando a resposta anterior....,
Vamos entender bem a situação para que possamos abstrair a solução correta. Você possui uma Entidade (tabela) que armazena todas as entregas dos motoqueiros. Certo?
Sendo assim, para você ter todas as entregas feitas por um determinado motoqueiro, em um determinado período, o ideal é você utilizar a sua Query, pode ser com o DataSetProvider, e com o ClientDataSet, mas seria desnecessário caso a Query não seja SqlQuery, você so precisa utilizar a estrutura de DataSetProvider e ClientDataset quando trabalha com DataSet Unidirecionais, no caso o seria o SqlQuery. Para exibir o resultado da sua consulta utilizando a retornada pela Query use um DataSource com a propriedade DataSet Ligada a Query e um DbGrid com a propriedade ligada ao DataSource. A propriedade SQL de sua Query deve ficar como mostrado abaixo:
Select *
From TabelaEntregas
Where CampoMotoqueiro =:ParametroMotoqueiro
And CampoData between :ParametroDataIni and :ParamentroDataFim
No Delphi para ativar a consulta acima.
Se vc estiver utilizando uma Query da paleta BDE
Query.Close;
Query.ParamByName(ParametroMotoqueiro).asInteger := valor.. “se o campo motoqueiro na tabela for Integer”
Query.ParamByName(ParametroDataIni).asDateTime := valor.. Query.ParamByName(ParametroDataFim).asDateTime := valor..
Query.Open;
Se vc estiver utilizando um ADOQuery da paleta DbGo - ADO
AdoQuery.Close;
AdoQuery.Parameters.ParamByName(ParametroMotoqueiro).Value := valor;
AdoQuery.Parameters.ParamByName(ParametroDataIni).Value := valor;
AdoQuery.Parameters.ParamByName(ParametroDataFim).Value := valor;
AdoQuery.Open;
Se vc estiver utilizando um Componente SqlQuery da Paleta dbExpress
SqlQuery.Close;
SqlQuery.ParamByName(ParametroMotoqueiro).asInteger := valor.“se o campo motoqueiro na tabela for Integer”
SqlQuery.ParamByName(ParametroDataIni).asDateTime := valor.. SqlQuery.ParamByName(ParametroDataFim).asDateTime := valor..
SqlQuery.Open;
OBS. Lembrando que aqui você esta trabalhando com DataSet Unirecionais, e precisa utilizar a estrutura:
SQLConnection
SQLQuery – já utilizada
e
DataSetProvider
ClientDataSet
DataSource
Outra consideração muito importante para resolvermos a sua questão é entendermos com quais componentes de acesso a dados esta sendo feito a comunicação com o SQL SERVER, pois dependendo do tipo de Driver muda a forma de recebermos os dados da Query, como mostrado acima. Eu aconselho sempre a utilizar ADO, ou seja os componentes da paleta dbGO, todos os drivers em questão foram desenvolvidos pela Microsoft que também desenvolveu o SQL SERVER, ou seja “casamento” perfeito, resultando em 100% de compatibilidade. Se houver a necessidade de trabalhar com StoredProcedures para retornar os valores em questão, por favor me explique melhor o contexto. A idéia básica para uso de StoredProcedures no banco, como no caso do SqlServer, é para melhorar a performance de Inserção e Updates no banco.
Abraço...
GOSTEI 0
Guinther Pauli
04/11/2008
ola Carlos td bem?As respostas foram satisfatorias? Vc conseguiu resolver seu problema? Precisa de + alguma ajuda? Estamos a disposicao!abs
GOSTEI 0
Carlos Faria
04/11/2008
boa noite
ainda nao foi suficiente ja vi que trablhar com data e meio chato o problema é que o campo la no banco do tipo smalldatetime ou seja e datahora. como eu vou filtar os pedidos de determinada data ?
GOSTEI 0
Guinther Pauli
04/11/2008
Olá Carlos,
Vc não precisa preocupar-se com essa questão, tanto o campo DateTime como SmallDateTime irão funcionar da mesma forma, veja uma definição sobre esses tipos:
A diferença básica entre os dois esta na quantidade de bytes utilizados para o armazenamento, enquanto o datetime usa 8 bytes para o armazenamento, o smalldatetime usa apenas 4 bytes. É por esta razão que o datetime consegue armazenar um range maior de datas e com maior precisão que o smalldatetime.
Fiz um teste aqui agora, criei uma tabela com um campo SmallDateTime no Sql Server 2005, depois fiz uma query no Delphi utilizando ADOQuery e filtrei os registros da tabela pela data. Segue abaixo o SQL.
select *
from Table_1
where data between :dataIni and :datafim
Para ativá-la fiz os seguinte codigo:
with ADOQuery1 do
begin
Close;
Parameters.ParamByName(DataIni).value:= 01/01/2008; // aqui passei valores fixos mas pode vir de um MaskEdit por exemplo
Parameters.ParamByName(DataFim).value:= 30/01/2008;
Open;
end;
Funcionou perfeitamente. Você tentou fazer esse teste? Onde você esta com dificuldades?
Abraço
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
O código da explanação anterior (ID-> 343), funcionaria da mesma forma se vc utilizar da seguinte forma
Query1.Close;
Query1.ParamByName(DataIni).value:= 01/01/2008; // aqui passei valores fixos mas pode vir de um MaskEdit por exemplo
Query1.ParamByName(DataFim).value:= 30/01/2008;
Query1.Open;
O código do ID -> 343, usa o WITH é apenas para não precisarmos escrever o Query1 em todas as linhas, pois o WITH é inglês é COM.. então na linha abaixo estou dizendo.
with Query1 do == Com o Query1 faça.. o que vier entre o Begin e End .
Funcionou perfeitamente,
Você tentou fazer esse teste?
Onde você esta com dificuldades especificamente?
Na criação do SQL da Query ou na passagem de parâmetros?
Abraço
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
Continuo aguardando seu retorno,
abs
GOSTEI 0
Carlos Faria
04/11/2008
nao consegui atualizar o dado no grid se vc tiver um fonte de exemplo que funcione com o trio de compontentes envia ai para mim
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
A solicitação que faz, pelo que percebi pertence ao chamado 305.
Se for, por favor coloque essa solicitação no chamado 305, este chamado é o 306.
Somente após gravar sua solicitação lá(306) que poderei analisar e responder para você.
Preciso saber também se o problema deste chamado foi resolvido (305), visto que ele ainda está em aberto.
Grato pela compreensão,
abs.
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
Você tem mais alguma dúvida neste chamado ?
Posso considerá-lo como encerrado ?
abs
GOSTEI 0
Carlos Faria
04/11/2008
boa tarde guinter
a duvida e o seguinte la no banco o campo e do tipo smalldatetime ou seja data + hora eu quero filtar os registros por determinado dia sem a hora ex 31/10/2008 nao funciona pois no dia 31/10/2008 tem 300 pedidos cadastrados e ele nao filtra por causa da hora
se tiver jeito de fazer um video como o caso do dbgrid seria otimo pois aqui comigo nao funcionou os exemplos que vc me passou
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
ok,
Iremos providenciar uma vídeo....Guenta um pouquinho ai !!
abs
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
Só para ti posicionar,
Como estamos ainda "engatinhando" neste processo de consultoria,
Estamos nos adptando, ou seja, estamos com uma série de problemas internos que ainda estamos tendo que nos ajustar....novos consultores, versões diferentes, plataformas, adsl, etc, etc....
Por isso da demora em ti responder,
Ti peço desculpas e peço a gentiliza que aguarde mais um pouco,
Estaremos dando prioridade ao seu chamado,
Obrigado pela compreensão,
abs
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
Estamos analisando seu problema aqui e em muitos casos em que trabalhei com SQL Server não tive sucesso com DBX. O Sql Server é Microsoft e nada melhor do que drivers da própria para poder acessá-lo.
Sei que voce não gostaria de mudar o trio porém vc podeira fazer uma rotina com ADOConnection e AdoQuery e daí completar com DatasetProvider e ClientDataSet.
Um outra sugestão seria alterar o tipo do campo no banco para DateTime em carater emergencial.
Estou analisando outras soluções para poder auxiliá-lo.
abs
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
Fizemos uma vídeo que resolverá seu problema:
http://video.devmedia.com.br/naoexclusivos/RodrigoMourao/Consultoria/ExSmallDateTime.zip
Fonte do projetinho:
http://video.devmedia.com.br/naoexclusivos/RodrigoMourao/Consultoria/ExemploSmallDateTime.rar
Adicionalmente ao que foi exposto na vídeo, segue também algumas maneiras adicionais para a passagem de parâmetros:
dbo_Orders.ParamByName(Data1).AsString := 11/20/1996 00:00:00;
dbo_Orders.ParamByName(Data2).AsString := 11/29/1996 23:59:59;
dbo_Orders.ParamByName(Data1).AsString := 11-20-1996 00:00:00;
dbo_Orders.ParamByName(Data2).AsString := 11-29-1996 23:59:59;
dbo_Orders.ParamByName(Data1).AsString := 1996-11-20 00:00:00;
dbo_Orders.ParamByName(Data2).AsString := 1996-11-29 23:59:59;
dbo_Orders.ParamByName(Data1).AsString := 1996/11/20 00:00:00;
dbo_Orders.ParamByName(Data2).AsString := 1996/11/29 23:59:59; Fico no seu aguardo para fecharmos esse chamado, abs
dbo_Orders.ParamByName(Data2).AsString := 11/29/1996 23:59:59;
dbo_Orders.ParamByName(Data1).AsString := 11-20-1996 00:00:00;
dbo_Orders.ParamByName(Data2).AsString := 11-29-1996 23:59:59;
dbo_Orders.ParamByName(Data1).AsString := 1996-11-20 00:00:00;
dbo_Orders.ParamByName(Data2).AsString := 1996-11-29 23:59:59;
dbo_Orders.ParamByName(Data1).AsString := 1996/11/20 00:00:00;
dbo_Orders.ParamByName(Data2).AsString := 1996/11/29 23:59:59; Fico no seu aguardo para fecharmos esse chamado, abs
GOSTEI 0
Carlos Faria
04/11/2008
Boa tarde Rodrigo
O Exemplo que vc me passou funciona perfeitamente so tem um problema eu nao vou poder deixar o usuario digitar a data ainda mas no padrao sqlserver que usa o data americana.
Vou ter que usar um componennte tdatetimepicute ou similar , e ai como eu vou fazer para passar ele para a proc
como eu vou formatar para ele virar string ?
GOSTEI 0
Guinther Pauli
04/11/2008
Carlos,
Com essa vídeo acredito que zeramos suas dúvidas nesse chamado,
http://video.devmedia.com.br/naoexclusivos/RodrigoMourao/Consultoria/Chamado386-DataPicker.zip
Aguardamos seu retorno,
abs
GOSTEI 0
Carlos Faria
04/11/2008
Com certeza pode zerar ai que deu certo !
Valeu
GOSTEI 0
Carlos Faria
04/11/2008
Rapaz , estou ficando ate sem geito de fazer pergunta ja , essa ta dificil
no sqlserver 2000 funcionou o que vc me mandou por isso eu ate fechei o chamado , mais na maquina do cliente aqui e sqlserver 2005 embora eu ache que tem nada a ver nao deu certo
eu tentei da seu jeito e desse tambem
DMBUSCA.sqldtMovdata.Close ;
DMBUSCA.sqldtMovdata.ParamByName(datainicial).AsString := FormatDateTime (yyyy-mm-dd 00:00:00,dataInicial.Date) ;
DMBUSCA.sqldtMovdata.ParamByName(Datafinal).AsString := FormatDateTime (yyyy-mm-dd 23:59:59,datafinal.Date) ;
DMBUSCA.cdsMovdata.Close ;
DMBUSCA.cdsMovdata.Open ; padrao de data YYYY/mm/dd DD/MM/YYYY DD-mm-yyyy
tentei com os caracter / e - nao funcionou cara precisa fazer video aula nao so veja se tem alguma diferenca nos sql 2000 para 2005 pq aqui nao deu certo tente de todas as maneiras minha query é select * from vw_pedido where Data between :dataInicial and :datafinal //acho que ta tudo ok ai ? bota da consulta copiei o codigo que vc mandou e tentei de tods os formatos possiveis ?
DMBUSCA.sqldtMovdata.ParamByName(datainicial).AsString := FormatDateTime (yyyy-mm-dd 00:00:00,dataInicial.Date) ;
DMBUSCA.sqldtMovdata.ParamByName(Datafinal).AsString := FormatDateTime (yyyy-mm-dd 23:59:59,datafinal.Date) ;
DMBUSCA.cdsMovdata.Close ;
DMBUSCA.cdsMovdata.Open ; padrao de data YYYY/mm/dd DD/MM/YYYY DD-mm-yyyy
tentei com os caracter / e - nao funcionou cara precisa fazer video aula nao so veja se tem alguma diferenca nos sql 2000 para 2005 pq aqui nao deu certo tente de todas as maneiras minha query é select * from vw_pedido where Data between :dataInicial and :datafinal //acho que ta tudo ok ai ? bota da consulta copiei o codigo que vc mandou e tentei de tods os formatos possiveis ?
GOSTEI 0
Guinther Pauli
04/11/2008
Olá Carlos,
Preciso de sua gentiliza,
Já que este chamado você mesmo deu "ok" para encerrarmos ele, por uma questão de controle interno, ti peço que abra um novo chamado com essa dúvida supra citada, visto que para solucionarmos seu problema, teremos que analisar toda sua vídeo (todo seu código), fazermos um diagnóstico e ti ajudarmos numa solução.
Ti peço também que vincule a vídeo que você expôs seu problema (smalldatetime) juntamente com esse novo chamado.
Perceba que você colocou a vídeo sobre (smalldatetime) no chamado 457 que é seu também mas com o assunto: "Form de login".
De qualquer forma, saiba que estaremos analisando sua vídeo e responderemos no novo chamado que estou ti pedindo que o abra,
Agradeço,
abs
GOSTEI 0
Carlos Faria
04/11/2008
Valeu
eu consegui resolver aqui o problema era o padrao da data passada para sqlserver no video vc mostrou
mm/dd/yyyy mes,dia,ano
no meu aqui funcionou yyyy/dd/mm ano ,dia,mes
obrigado
GOSTEI 0
Guinther Pauli
04/11/2008
Ok Carlos,
abs
GOSTEI 0