PDA

Ver la Versión Completa : consultas sql en delphi 2007


nolo
24-10-2008, 18:39:57
hola tengo una ventana que me tira los datos de un vendedor, en el cual ingrreso como parametro el 'idvend' y 'las fechas desde y hasta'
utilizo un
-TADOConnection para conectarme a la base de datos
- TDataSource
- TADODataSet en donde esta cargada la consulta sql
- DBGrid para q visualize los datos
- y un TBotton en el cual quier que cuando lo aprete me muestre los datos, filtrando los parametros que describi previamente...


como lo hago???

Delphius
24-10-2008, 18:58:42
Hola nolo,
Bienvenido a Clubdelphi. Como eres nuevo, te recomendaría que te tomes unos minutos para leer la guia de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Con respecto a tu inquietud,
¿Cuál es tu duda realmente?

¿Tienes problemas para conectar o enlazar los componentes? ¿tu consulta SQL te arroja un error? Si es así, ¿Cuál y dónde?

Esto te lo pregunto porque al comienzo empiezas a describir todo, y al parecer que ya lo tienes hecho. Al menos eso parece indicar esta parte de tu mensaje:

tengo una ventana que me tira los datos de un vendedor, en el cual ingrreso como parametro el 'idvend' y 'las fechas desde y hasta'

Entonces la pregunta es ¿Lo tienes hecho o quieres hacerlo?
Si tienes algo de código sería útil que lo dieras a conocer.

Saludos,

nolo
24-10-2008, 20:30:09
hola amigo gracias por la bienvenida y disculpa por empresarme mal..

la ventana ya lo tengo todo echo, y enlazado con las bases de datos y todo, mi problema es que cuando apretieto el evento TBotton no me tira nada el DBGrid

en el TButton tengo este codigo

var
sQ: WideString;
begin
adsReporte.Open;
sQ := 'SELECT V.fDocumento, C.sRazonSocial, V.idTipoDoc, ((V.rTotBruto+V.rTotDescuentos)*TD.iAplicStock*(-1)) as totBruto,'+
'RIGHT('+QuotedStr('0000')+'+CAST(V.idPV AS VARCHAR),4)+'+QuotedStr(' - ')+
'+ RIGHT('+QuotedStr('00000000')+'+CAST(V.idNumDoc AS VARCHAR),8) as Numero, '+
'( SELECT SUM((rSubBruto+rSubDescuentos)*TID.iAplicStock*(-1)*(rComisionAPagar)) AS Comision'+
'FROM VentasItems VI, TiposDoc TID'+
'WHERE VI.idTipoDoc = TID.idTipoDoc'+
'AND VI.idTipoDoc = V.idTipoDoc'+
'AND VI.idPV = V.idPV'+
'AND VI.idNumdoc = V.idNumDoc ) AS Comision'+
'FROM Ventas V'+
'INNER JOIN Clientes C ON V.idCliente = C.idCliente'+
'INNER JOIN TiposDoc TD ON V.idTipoDoc = TD.idTipoDoc'+
'WHERE V.fDocumento >= dtpDesde.DateTime'+
'AND V.fDocumento <= dtpHasta.DateTime' +
'AND V.idVendedor := edtidVendedor.AsInteger'+
'AND V.bAnulado = 0'+
'ORDER BY V.idTipoDoc ASC, V.idPV ASC, V.idNumDoc ASC'+
'adsDatos1.CommandText := sQ;';
{adsReporte.Parameters.ParamByName('idVendedor').Value := TEdit1.AsInteger;
adsReporte.Parameters.ParamByName('FechaDesde').Value := dtpDesde.DateTime;
adsReporte.Parameters.ParamByName('FechaHasta').Value := dtpHasta.DateTime}
//adsReporte.CommandText := sQ;
//adsReporte.Close;

soy novato en esto, me se bastante sql pero poco delphi jeje
agradeceria tu ayuda

Delphius
24-10-2008, 20:41:20
Hola nolo,
Lo que veo, de vista rápida, es que primero haces el Open, luego le indicas la consulta y al final un Close.

El orden es en realidad al contrario.

1. Cerrar el DataSet
2. Armar consulta
3. Abrirlo

Por otro lado, para escribir código delphi y se resalte, usa las etiquetas delphi. De este modo:



tu código aqui...



Saludos,

nolo
24-10-2008, 20:54:40
bueno disculpas nuevamente, este seria mi codigo

si primero cierro el dataset y despues lo abro como decis vos, me tira un errorcito, la unica forma de que por lo menos se ejecute era ponerlo de esa forma a pesar de que yo tenia entendido de que es como tu dices

procedure TForm2.Button1Click(Sender: TObject);
var
sQ: WideString;
begin
adsReporte.Open;
sQ := 'SELECT V.fDocumento, C.sRazonSocial, V.idTipoDoc, ((V.rTotBruto+V.rTotDescuentos)*TD.iAplicStock*(-1)) as totBruto,'+
'RIGHT('+QuotedStr('0000')+'+CAST(V.idPV AS VARCHAR),4)+'+QuotedStr(' - ')+
'+ RIGHT('+QuotedStr('00000000')+'+CAST(V.idNumDoc AS VARCHAR),8) as Numero, '+
'( SELECT SUM((rSubBruto+rSubDescuentos)*TID.iAplicStock*(-1)*(rComisionAPagar)) AS Comision'+
'FROM VentasItems VI, TiposDoc TID'+
'WHERE VI.idTipoDoc = TID.idTipoDoc'+
'AND VI.idTipoDoc = V.idTipoDoc'+
'AND VI.idPV = V.idPV'+
'AND VI.idNumdoc = V.idNumDoc ) AS Comision'+
'FROM Ventas V'+
'INNER JOIN Clientes C ON V.idCliente = C.idCliente'+
'INNER JOIN TiposDoc TD ON V.idTipoDoc = TD.idTipoDoc'+
'WHERE V.fDocumento >= :FechaDesde'+
'AND V.fDocumento <= :FechaHasta' +
'AND V.idVendedor := :idVendedor'+
'AND V.bAnulado = 0'+
'ORDER BY V.idTipoDoc ASC, V.idPV ASC, V.idNumDoc ASC'+
'adsDatos1.CommandText := sQ;';
{adsReporte.Parameters.ParamByName('idVendedor').Value := TEdit1.AsInteger;
adsReporte.Parameters.ParamByName('FechaDesde').Value := dtpDesde.DateTime;
adsReporte.Parameters.ParamByName('FechaHasta').Value := dtpHasta.DateTime}
//adsReporte.CommandText := sQ;
//adsReporte.Close;
end;
end.

en fin mi pregunta es, si esta bien el codigo en el TBotton o si es que falta algo o sobra, porque no me tira nada el DBGrid

Delphius
24-10-2008, 21:03:32
Ummm, veamos, debería funcionarte de este modo:

TuDataSet.Close;
tuDatSet.SQL.Clear;
TuDataSet.SQL.Add('select ....');
TuDataSet.SQL.Add('from ... ');
TuDataSet.SQL.Add('where ... ');
TuDataSet.Parameters.ParamByName('tu_parametro').Value := ...
TuDataSet.Parameters.ParamByName('tu_parametro').Datatype := ftxxxx;
// Otros parámetros...

TuDataSet.Open;

Acabo de releer tu post inicial. ¿Empleas TADODataSet? No se si tendrá algo que ver... pero prueba con un TADOQuery.

Saludos,

nolo
24-10-2008, 21:44:14
si con esa estructura la probe al principio, es la que todos usan, pero tampco me andubo che, ni usando TADOQuery... que macana

bueno tratare de encoontrar la solucion, gracias por tu tiempo.. saludos

Delphius
25-10-2008, 02:10:32
¿Te aseguraste de que estén bien enlazados los componentes? ¿Te aseguraste de que el TADOConection esté conectado y que los demás controles estén activados?

¿Podrías indicarnos como estás llevando la conexión y el enlace de los componentes?

¿Te arroja un error? Si es así, cual y en que línea.

Necesitaríamos conocer más detalle de tu situación para poder ayudarte. Cuanto más información nos proporciones más fácil será hallar el problema y su solución (o en su defecto, alguna alternativa).
No te vamos a cobrar por la cantidad de líneas que escribas. Sientete en confianza.

Saludos,

nolo
25-10-2008, 13:47:20
Mira estos son los valores (a mi entender mas importantes) que tengo...
Creo que esta todo bien enlazado
TADOConnection
- Connected: True
- Connection String: Provider=SQL.......... (Verificado tiene coneccion)
- DefaultDataBase: (mi base de datos)
- KeepConnectio: True
- Name: .....
TADODataSet
- CommandText: mi codigo sql
- ConnectionString: no tiene nada porque lo conecte asi:
- Linkage (Connection: TADOConnection) esta bien esto??
- Parameters: los 3 que tiene estan verificados
- Active: True
TDataSource
-Action, Input y Visual
- Enabled: True
- DataSet: TADODataSet
DBGrid
- Action y Visual
- Enabled: True
- Visible: True
- DataSource: TDataSource
El problema no es que me tira error, el problema es que no me tira nada cuando apreto el TBotton..
el contenido del TBotton ya te lo puse mas arriba...

nolo
25-10-2008, 13:59:16
y si lo hago segun tu estructura quedaria asi no??

adsReporte.Close;
adsReporte.SQL.Clear;
adsReporte.SQL.Add('select V.fDocumento, C.sRazonSocial, V.idTipoDoc, ((V.rTotBruto+V.rTotDescuentos)*TD.iAplicStock*(-1)) as totBruto,);
adsReporte.SQL.Add('RIGHT('+QuotedStr('0000')+'+CAST(V.idPV AS VARCHAR),4)+'+QuotedStr(' - '));
adsReporte.SQL.Add(' + RIGHT('+QuotedStr('00000000')+'+CAST(V.idNumDoc AS VARCHAR),8) as Numero, ');
adsReporte.SQL.Add('( SELECT SUM((rSubBruto+rSubDescuentos)*TID.iAplicStock*(-1)*(rComisionAPagar)) AS Comision ');
adsReporte.SQL.Add('FROM VentasItems VI, TiposDoc TID');
adsReporte.SQL.Add('WHERE VI.idTipoDoc = TID.idTipoDoc');
adsReporte.SQL.Add('AND VI.idTipoDoc = V.idTipoDoc');
adsReporte.SQL.Add('AND VI.idPV = V.idPV');
adsReporte.SQL.Add('AND VI.idNumdoc = V.idNumDoc ) AS Comision');
adsReporte.SQL.Add('from'FROM Ventas V');
adsReporte.SQL.Add('INNER JOIN Clientes C ON V.idCliente = C.idCliente');
adsReporte.SQL.Add('INNER JOIN TiposDoc TD ON V.idTipoDoc = TD.idTipoDoc');
adsReporte.SQL.Add('whereWHERE V.fDocumento >= dtpDesde.DateTime');
adsReporte.SQL.Add('AND V.fDocumento <= dtpHasta.DateTime');
adsReporte.SQL.Add('AND V.idVendedor := edtidVendedor.AsInteger');
adsReporte.SQL.Add('AND V.bAnulado = 0');
adsReporte.SQL.Add('ORDER BY V.idTipoDoc ASC, V.idPV ASC, V.idNumDoc ASC');
adsReporte.Parameters.ParamByName('idVendedor').Value := TEdit1.AsInteger
adsReporte.Parameters.ParamByName('FechaDesde').Value := dtpDesde.DateTime
adsReporte.Parameters.ParamByName('FechaHasta').Value := dtpHasta.DateTime;
adsReporte.Open;

me tira error en la segunda linea, osea aca
adsReporte.SQL.Clear;

Caral
25-10-2008, 14:39:03
Hola
procedure TForm2.Button1Click(Sender: TObject);
var sQ: WideString;
begin
adsReporte.SQL.Clear;
sQ := 'SELECT V.fDocumento, C.sRazonSocial, V.idTipoDoc, ((V.rTotBruto+V.rTotDescuentos)*TD.iAplicStock*(-1)) as totBruto,'+
'RIGHT('+QuotedStr('0000')+'+CAST(V.idPV AS VARCHAR),4)+'+QuotedStr(' - ')+
'RIGHT('+QuotedStr('00000000')+'+CAST(V.idNumDoc AS VARCHAR),8) as Numero, '+
'( SELECT SUM((rSubBruto+rSubDescuentos)*TID.iAplicStock*(-1)*(rComisionAPagar)) AS Comision'+
'FROM VentasItems VI, TiposDoc TID'+
'WHERE VI.idTipoDoc = TID.idTipoDoc'+
'AND VI.idTipoDoc = V.idTipoDoc'+
'AND VI.idPV = V.idPV'+
'AND VI.idNumdoc = V.idNumDoc ) AS Comision'+
'FROM Ventas V'+
'INNER JOIN Clientes C ON V.idCliente = C.idCliente'+
'INNER JOIN TiposDoc TD ON V.idTipoDoc = TD.idTipoDoc'+
'WHERE V.fDocumento >= :FechaDesde'+
'AND V.fDocumento <= :FechaHasta' +
'AND V.idVendedor := :idVendedor'+
'AND V.bAnulado = 0'+
'ORDER BY V.idTipoDoc ASC, V.idPV ASC, V.idNumDoc ASC'+
'adsDatos1.CommandText := sQ;';
adsReporte.SQL.Add(sQ);
adsReporte.Open;
end;
end.

No veo parametros por ningun lado.
Saludos

Delphius
25-10-2008, 14:47:07
Tal vez la pregunta que diré es un tanto tonta pero es necesaria: ¿Te aseguraste de que la consulta devuelve datos?

Prueba lanzar esta misma consulta desde el editor del motor que empleas.

O si no prueba con esto:

tuDataSet.Open;
if tuDataSet.RecordCount > 0
then ShowMessage('Hay datos')
else ShowMessage('No hay datos');

Y disculpa mi insistencia, pero creo que es conveniente emplear el TADOQuery, que es el componente más conveniente.

Saludos,

Caral
25-10-2008, 14:51:41
Hola
Ya vi los parametros:

procedure TForm2.Button1Click(Sender: TObject);
var sQ: WideString;
begin
adsReporte.SQL.Clear;
sQ := 'SELECT V.fDocumento, C.sRazonSocial, V.idTipoDoc, ((V.rTotBruto+V.rTotDescuentos)*TD.iAplicStock*(-1)) as totBruto,'+
'RIGHT('+QuotedStr('0000')+'+CAST(V.idPV AS VARCHAR),4)+'+QuotedStr(' - ')+
'RIGHT('+QuotedStr('00000000')+'+CAST(V.idNumDoc AS VARCHAR),8) as Numero, '+
'( SELECT SUM((rSubBruto+rSubDescuentos)*TID.iAplicStock*(-1)*(rComisionAPagar)) AS Comision'+
'FROM VentasItems VI, TiposDoc TID'+
'WHERE VI.idTipoDoc = TID.idTipoDoc'+
'AND VI.idTipoDoc = V.idTipoDoc'+
'AND VI.idPV = V.idPV'+
'AND VI.idNumdoc = V.idNumDoc ) AS Comision'+
'FROM Ventas V'+
'INNER JOIN Clientes C ON V.idCliente = C.idCliente'+
'INNER JOIN TiposDoc TD ON V.idTipoDoc = TD.idTipoDoc'+
'WHERE V.fDocumento >= :FechaDesde'+
'AND V.fDocumento <= :FechaHasta' +
'AND V.idVendedor := :idVendedor'+
'AND V.bAnulado = 0'+
'ORDER BY V.idTipoDoc ASC, V.idPV ASC, V.idNumDoc ASC'+
'adsDatos1.CommandText := sQ;';
adsReporte.SQL.Add(sQ);
adsReporte.Parameters.ParamByName('idVendedor').Value := TEdit1.Text;
adsReporte.Parameters.ParamByName('FechaDesde').Value := DateTostr(dtpDesde.DateTime);
adsReporte.Parameters.ParamByName('FechaHasta').Value := DateToStr(dtpHasta.DateTime);
adsReporte.Open;
end;
end.
Saludos

Caral
25-10-2008, 15:09:44
Hola
Estoy mas ciego que una cabra.:D
Nunca he trabajado con dataset, asi que supongo que sera asi, no me hagan mucho caso.

procedure TForm2.Button1Click(Sender: TObject);
var sQ: WideString;
begin
adsReporte.CommandText.Clear;
sQ := 'SELECT V.fDocumento, C.sRazonSocial, V.idTipoDoc, ((V.rTotBruto+V.rTotDescuentos)*TD.iAplicStock*(-1)) as totBruto,'+
'RIGHT('+QuotedStr('0000')+'+CAST(V.idPV AS VARCHAR),4)+'+QuotedStr(' - ')+
'RIGHT('+QuotedStr('00000000')+'+CAST(V.idNumDoc AS VARCHAR),8) as Numero, '+
'( SELECT SUM((rSubBruto+rSubDescuentos)*TID.iAplicStock*(-1)*(rComisionAPagar)) AS Comision'+
'FROM VentasItems VI, TiposDoc TID'+
'WHERE VI.idTipoDoc = TID.idTipoDoc'+
'AND VI.idTipoDoc = V.idTipoDoc'+
'AND VI.idPV = V.idPV'+
'AND VI.idNumdoc = V.idNumDoc ) AS Comision'+
'FROM Ventas V'+
'INNER JOIN Clientes C ON V.idCliente = C.idCliente'+
'INNER JOIN TiposDoc TD ON V.idTipoDoc = TD.idTipoDoc'+
'WHERE V.fDocumento >= :FechaDesde'+
'AND V.fDocumento <= :FechaHasta' +
'AND V.idVendedor := :idVendedor'+
'AND V.bAnulado = 0'+
'ORDER BY V.idTipoDoc ASC, V.idPV ASC, V.idNumDoc ASC';
adsReporte.CommandText := sQ;
adsReporte.Parameters.ParamByName('idVendedor').Value := TEdit1.Text;
adsReporte.Parameters.ParamByName('FechaDesde').Value := DateTostr(dtpDesde.DateTime);
adsReporte.Parameters.ParamByName('FechaHasta').Value := DateToStr(dtpHasta.DateTime);
adsReporte.Open;
end;
end.
Saludos

ContraVeneno
25-10-2008, 15:55:48
y si lo hago segun tu estructura quedaria asi no??

me tira error en la segunda linea, osea aca
adsReporte.SQL.Clear;

with adsReporte do begin //Donde adsReporte es un TADOQuery
If active then Close;
SQL.Clear;
SQL.Add('select V.fDocumento, C.sRazonSocial, V.idTipoDoc, ((V.rTotBruto+V.rTotDescuentos)*TD.iAplicStock*(-1)) as totBruto,');
....
SQL.Add('ORDER BY V.idTipoDoc ASC, V.idPV ASC, V.idNumDoc ASC');
Parameters.ParamByName('idVendedor').Value := TEdit1.AsInteger
Parameters.ParamByName('FechaDesde').Value := dtpDesde.DateTime
Parameters.ParamByName('FechaHasta').Value := dtpHasta.DateTime;
Open;
end; //with


Edite un poco el código, esa sería la manera más adecuada de realizar la consulta que deseas. Y debería funcionar correctamente. Si te marca error en la linea "SQL.Clear", por favor, dinos cuál error es el que te marca para saber cuál es el problema.

nolo
27-10-2008, 11:47:27
Hola amigo tampoco anda, y si verifique la consulta me tira datos en el motor uso sql server 2008...
Tendrias un proyecto delphi por ahi de como hacer consultas, uno sencillo a modo de ejemplo... y que utilice aunque sea un parametro....
te lo agradeceria asi lo voy mirando..

nolo
27-10-2008, 13:11:21
mira estos son los errores que me tira el SQL.Clear

[DCC Error] EjemploFamilias.pas(38): E2003 Undeclared identifier: 'SQL'
[DCC Error] EjemploFamilias.pas(39): E2066 Missing operator or semicolon
[DCC Error] EjemploFamilias.pas(40): E2066 Missing operator or semicolon
[DCC Error] EjemploFamilias.pas(41): E2066 Missing operator or semicolon
[DCC Error] EjemploFamilias.pas(42): E2003 Undeclared identifier: 'AsInteger'
[DCC Error] EjemploFamilias.pas(43): E2066 Missing operator or semicolon
[DCC Error] Project1.dpr(5): F2063 Could not compile used unit 'EjemploFamilias.pas'

Delphius
27-10-2008, 13:27:13
Es evidente que estás empleando un componente distinto a TADOQuery, si te da ese error en la línea SQL.Clear es porque el componentes que usas no es un TADOQuery o algún otro componente TXxxQuery.

Por otro lado los errores "E2066 Missing operator or semicolon" se deben a que falta el punto y coma al final de la sentencia.

El error AsInteger se debe a que el componente TEdit no posee esta propiedad. A menos que se trate de un componente de terceros (intuyo que es un TEdit de la biblioteca JEDI) que disponga de dicho método o propiedad no va a funcionar.

ContraVeneno nos podría aclarar este asunto.
Mientras tanto, si tienes el Edit, puedes hacer esto:

.... := StrToInt(Edit1.Text);

En ves del Edit1.AsInteger

Saludos,

nolo
27-10-2008, 13:58:23
y este error porque es??

Project Project1.exe raised exception class EOLeException with message 'Objeto Parameter mas definido. Se proporciono informacion incompleta o incoherente'

ya le arregle lo que me dijiste del parametro pero de cualquiera de las dos formas me tira este error cuando ingreso el parametro y lo doy al TBotton