PDA

Ver la Versión Completa : Como extraer inforcion de un campo en dos columnas de un dbgrid!!!!


jomah
24-02-2012, 21:28:17
Buenos Dias

Mi dilema es que de un campo de una tabla tengo que sacar dos columnas pero la info que debe haber en una no debe salir en la otra. Ejemplo:
tabla->MO12.....
campo->MONTOMOV . . . . .Columns de DBGRID-> DEBE . . . . . HABER
. . . . . ------------ . . . . . . . . . . . . . . . . . . . --------- . . ------------
inform-> 300.16 . . . . . . . . . . . . . . . . . . . . . . . 300.16
. . . . . . 200.34 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200.34
. . . . . . . 16.34 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.34

en la tabla hay otro campo que clasifica los numeros del MONTOMOV:
campo->DEBE_HABER
. . . . . .-------------
Iinform-> . . .D
. . . . . . . . . .H
. . . . . . . . . .H
Y no se como hacer para que el DBGRID agarre la tabla MONTOMOV y la divida en 2 y los clasifique.
Hise el siguiiente codigo:

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= 'SELECT NUM_CTA,NUMDEPTO,CONCEP_PO,TIPCAMBIO, CASE WHEN DEBE_HABER='+QUOTEDSTR('D')+' THEN SELECT MONTOMOV as DEBE FROM '+Tab+' END, CASE WHEN DEBE_HABER='+QUOTEDSTR('H')+' THEN SELECT MONTOMOV as HABER FROM '+Tab+' END from '+Tab+' WHERE DEBE_HABER= '+QUOTEDSTR('H')+' OR DEBE_HABER= '+QUOTEDSTR('D')+'';
Query1.Active:=True;
end;

Pero me tira error

GRACIAS DE ANTEMANO

ecfisa
24-02-2012, 21:34:20
Hola jomah.

Por favor, cuando incluyas código en tus mensaje usa TAG's, su uso es:

http://img403.imageshack.us/img403/3461/75416396.jpg

Saludos y gracias por tu colaboración.

Casimiro Notevi
24-02-2012, 21:55:27
Pero me tira error
¿Tenemos que adivinar el error? ;)

Recuerda nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias.

Caral
24-02-2012, 21:59:41
Hola
¿Tenemos que adivinar el error? ;)

Recuerda nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias.
La BD, el concepto, el componente, el etc y para que no falte el otro etc....;)
No se que cuesta poner TODA la información.
No me habéis dicho desde cuando cobráis por letra.:):eek:
Saludos

jomah
24-02-2012, 22:19:33
unit frmModelo;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, StdCtrls, Buttons, Grids, DBGrids, ComCtrls, Mask,
DBCtrls;

type
TfrmModelo1 = class(TForm)
DBGrid1: TDBGrid;
IMPRIMIR: TBitBtn;
SALIR: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
DataSource1: TDataSource;
Query1: TQuery;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
Query1NUM_CTA: TStringField;
Query1NUMDEPTO: TSmallintField;
Query1CONCEP_PO: TStringField;
Query1TIPCAMBIO: TFloatField;
Query1MONTOMOV: TFloatField;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmModelo1: TfrmModelo1;
Tab: String;

implementation

{$R *.dfm}

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= 'SELECT NUM_CTA,NUMDEPTO,CONCEP_PO,TIPCAMBIO, CASE WHEM DEBE_HABER='+QUOTEDSTR('D')+' THEN SELECT MONTOMOV as DEBE FROM '+Tab+' END, CASE WHEM DEBE_HABER='+QUOTEDSTR('H')+' THEN SELECT MONTOMOV as HABER FROM '+Tab+' END from '+Tab+'';
Query1.Active:=True;
end;

end.

y el errorn que me da cuando intenta entrar en la informacion de la tablame dice token: when

Caral
24-02-2012, 22:25:45
Hola
Solo por arreglar algo esta consulta, sin modificarla.

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA,NUMDEPTO,CONCEP_PO,TIPCAMBIO, '+
' CASE WHEM DEBE_HABER='+QUOTEDSTR('D')+' THEN SELECT MONTOMOV as DEBE FROM '+Tab+' END, '+
' CASE WHEM DEBE_HABER='+QUOTEDSTR('H')+' THEN SELECT MONTOMOV as HABER FROM '+Tab+' END '+
' from '+Tab+'';
Query1.Active:=True;
end;
end;
Saludos

luisgutierrezb
24-02-2012, 22:25:58
bueno en el codigo pegado dice whem no wheN, tal vez sea el error

jomah
24-02-2012, 23:05:50
no el error me sigue apareciendo y dice asi:
invalid use of keyword
token: WHEN
Line number: 1.

ecfisa
24-02-2012, 23:23:07
Hola.

La sintáxis (al menos en Firebird) es:

CASE
WHEN <bool_exp1> THEN result1
WHEN <bool_exp2> THEN result2
...
[ELSE defaultresult]
END


Probá quitando el segundo CASE:

...
'CASE WHEN DEBE_HABER = '+QUOTEDSTR('D')+' THEN SELECT MONTOMOV as DEBE FROM ' + Tab + ' END, '+
'WHEN DEBE_HABER = '+QUOTEDSTR('H')+' THEN SELECT MONTOMOV as HABER FROM ' + Tab + ' END '+
...


Saludos.

jomah
25-02-2012, 00:03:02
no el error todavia me sigue apareciendo
ya nno ayo que acer con ese case

Casimiro Notevi
25-02-2012, 00:08:55
... ya nno ayo que acer con ese case

Disculpa, ¿qué dice ahí?

jomah
25-02-2012, 00:10:37
que ya no allo que hacer con ese 'case'

Casimiro Notevi
25-02-2012, 00:42:45
¿Puedes copiar aquí exactamente el código que estás usando?

jomah
25-02-2012, 00:54:24
unit frmModelo;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, StdCtrls, Buttons, Grids, DBGrids, ComCtrls, Mask,
DBCtrls;

type
TfrmModelo1 = class(TForm)
DBGrid1: TDBGrid;
IMPRIMIR: TBitBtn;
SALIR: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
DataSource1: TDataSource;
Query1: TQuery;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
Query1NUM_CTA: TStringField;
Query1NUMDEPTO: TSmallintField;
Query1CONCEP_PO: TStringField;
Query1TIPCAMBIO: TFloatField;
Query1MONTOMOV: TFloatField;
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmModelo1: TfrmModelo1;
Tab: String;

implementation

{$R *.dfm}

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA,NUMDEPTO,CONCEP_PO,TIPCAMBIO, '+
'CASE WHEN DEBE_HABER = '+QUOTEDSTR('D')+' THEN SELECT MONTOMOV as DEBE FROM ' + Tab + ' END, '+
'WHEN DEBE_HABER = '+QUOTEDSTR('H')+' THEN SELECT MONTOMOV as HABER FROM ' + Tab + ' END '+
' from '+Tab+'';
Query1.Active:=True;
end;

procedure TfrmModelo1.FormCreate(Sender: TObject);
begin

end;

end.

Caral
25-02-2012, 01:02:10
Hola
Son dos condiciones:

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA,NUMDEPTO,CONCEP_PO,TIPCAMBIO, '+
' iif( DEBE_HABER = 'D', (MONTOMOV as DEBE) , (MONTOMOV as HABER) ) from '+Tab;
Query1.Active:=True;
end;
end;
Saludos

Caral
25-02-2012, 01:05:15
Hola
Con Case es igual, son dos condiciones, si no es una entonces es la otra:

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA,NUMDEPTO,CONCEP_PO,TIPCAMBIO, '+
' CASE WHEN DEBE_HABER = 'D' THEN (MONTOMOV as DEBE) ELSE (MONTOMOV as HABER) END '+
' From '+Tab;
Query1.Active:=True;
end;
end;
Saludos

Al González
25-02-2012, 01:10:46
Hola jomah.

Te marcaba error en "When" porque cerrabas el Case prematuramente. Según te mostró ecfisa en mensajes anteriores, el End del case va después de todas las opciones "When". O sea que no es un "End" por cada When, sino un sólo "End" al final del Case. :)

En cuanto a la marca Acer de tu computadora, no creo que sea factor en este caso. ;)

Caral
25-02-2012, 01:25:58
Hola
Otra opción:


procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA, NUMDEPTO, CONCEP_PO, TIPCAMBIO, '+
' CASE WHEN DEBE_HABER ='+QUOTEDSTR('D')+' THEN (MONTOMOV as DEBE) END, '+
' CASE WHEN DEBE_HABER ='+QUOTEDSTR('H')+' THEN (MONTOMOV as HABER) END '+
' from '+Tab;
Query1.Active:=True;
end;
end;

No estoy muy seguro de esta, me gustan mas las otras dos.
Saludos

jomah
25-02-2012, 01:40:02
gracias muchas gracias por la ayuda

ahora ya no me tira error en el when ahora me dice token: = osea error en el igual

Caral
25-02-2012, 01:44:26
Hola
Tokem....... Que ?.
No creo que sea solo eso el error, que dice el error completo ?.
Cual de todos los codigos te ha funcionado, asi nos entendemos mejor ?
Saludos

Caral
25-02-2012, 01:51:58
Hola
Una pregunta bien tonta:
Donde declaras la variable Tab ?.
Saludos
Edito: Me respondo, global.

jomah
25-02-2012, 02:18:37
El Error Dice :
Invalid Use Of Keywork
Token: =
Line Number: 1.
Ese Es Lo Que Dice El Error

Caral
25-02-2012, 02:26:19
Hola
Puedes hacer esta prueba para descartar cosas:

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA, NUMDEPTO, CONCEP_PO, TIPCAMBIO, '+
' CASE WHEN DEBE_HABER ='+QUOTEDSTR('D')+' THEN (MONTOMOV as DEBE) END, '+
' CASE WHEN DEBE_HABER ='+QUOTEDSTR('H')+' THEN (MONTOMOV as HABER) END '+
' from MO021201';
Query1.Active:=True;
end;
end;
Saludos

Caral
25-02-2012, 03:15:53
Hola
Cualquiera de estas dos funciona perfectamente:

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA, NUMDEPTO, CONCEP_PO, TIPCAMBIO, '+
' (CASE WHEN DEBE_HABER ='+QUOTEDSTR('D')+' THEN ''DEBE'' ELSE ''N'' END) AS DEBE, '+
' (CASE WHEN DEBE_HABER ='+QUOTEDSTR('H')+' THEN ''HABER'' ELSE ''N'' END) AS HABER '+
' from '+Tab;
Query1.Active:=True;
end;
end;

o esta, para mi mas sencilla:

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
query1.sql.text:= ' SELECT NUM_CTA, NUMDEPTO, CONCEP_PO, TIPCAMBIO, '+
' (CASE WHEN DEBE_HABER ='+QUOTEDSTR('D')+' THEN ''DEBE'' ELSE ''HABER'' END) AS DEBE, '+
' from '+Tab;
Query1.Active:=True;
end;
end;

Las dos generan el mismo resultado.
NO se puede, o por lo menos en Firebird no me dejo poner el nombre del campo, creo que ese es el problema.
Saludos

ecfisa
26-02-2012, 01:45:23
Hola jomah.

De este modo también funciona:

procedure TForm1.Button1Click(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT NUM_CTA, NUMDEPTO, CONCEP_PO, TIPCAMBIO,');
SQL.Add('(CASE DEBE_HABER WHEN ''D'' THEN MONTOMOV ELSE 0 END) AS DEBE,');
SQL.Add('(CASE DEBE_HABER WHEN ''H'' THEN MONTOMOV ELSE 0 END) AS HABER');
SQL.Add('FROM ' + Tab);
Open;
end;
end;

Con todas las propuestas que has recibido, logicamente no podía ser un código muy original... :p:)

Saludos.

olbeup
27-02-2012, 09:03:11
Cuando realicéis una SQL, que os cuesta hacerla bien, a la hora de detectar un error, no será mejor si la SQL está bien distribuida.

...
begin
Tab := FormatDateTime('"MO"mmyy01', Now);
with Query1 do
begin
SQL.Add('SELECT');
SQL.Add(' NUM_CTA');
SQL.Add(' ,NUMDEPTO');
SQL.Add(' ,CONCEP_PO');
SQL.Add(' ,TIPCAMBIO');
SQL.Add(' ,DEBE =');
SQL.Add(' CASE');
SQL.Add(' WHEN DEBE_HABER = ''D'' THEN MONTOMOV');
SQL.Add(' ELSE 0');
SQL.Add(' END');
SQL.Add(' ,HABER =');
SQL.Add(' CASE');
SQL.Add(' WHEN DEBE_HABER = ''H'' THEN MONTOMOV');
SQL.Add(' ELSE 0');
SQL.Add(' END');
SQL.Add(' FROM ' + Tab);

Open;
end;
end;
Esto es para SQL SERVER, si es lo que estas usando y sino encuentra la forma correcta para tu motor.

upsss, creo que ecfisa se me ha adelantado

Un saludo.

jomah
02-03-2012, 17:35:59
el codigo lo modifique ya que al ser tablas paradox no me permite utilizar case y solo agunas veces el if lo modifique de la siguiente manera:
unit frmModelo;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, StdCtrls, Buttons, Grids, DBGrids, ComCtrls, Mask,
DBCtrls, DBClient, XPMan, Provider;

type
TfrmModelo1 = class(TForm)
DBGrid1: TDBGrid;
IMPRIMIR: TBitBtn;
SALIR: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
dbedtNUM_REG: TDBEdit;
dbedtNUM_REG1: TDBEdit;
dbedtFECHA_POL: TDBEdit;
DataSource1: TDataSource;
Query2: TQuery;
xpmnfst1: TXPManifest;
dtstprvdr1: TDataSetProvider;
ds1: TClientDataSet;
strngfldds1NUM_CTA: TStringField;
smlntfldds1NUMDEPTO: TSmallintField;
strngfldds1CONCEP_PO: TStringField;
fltfldds1TIPCAMBIO: TFloatField;
strngfldds1DEBE_HABER: TStringField;
fltfldds1MONTOMOV: TFloatField;
intgrfldds1NUM_REG: TIntegerField;
strngfldds1TIPO_POLI: TStringField;
dtmfldds1FECHA_POL: TDateTimeField;
strngfldds1NUM_POLIZ: TStringField;
fltfldds1DEBE1: TFloatField;
fltfldds1HEBER1: TFloatField;
procedure SALIRClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmModelo1: TfrmModelo1;
Tab: string;
d1: string;
d2: Currency;
d3: string;
d4: Integer;
x: Integer;
implementation

uses frmPrincipal;

{$R *.dfm}

procedure TfrmModelo1.SALIRClick(Sender: TObject);
begin
CLOSE;
frmPrincipal1.BringToFront;
frmPrincipal1.Enabled:=True;
frmPrincipal1.DBGrid1.Enabled:=True;
end;

procedure TfrmModelo1.FormShow(Sender: TObject);
begin
Tab:= 'MO' + FormatDateTime('mmyy', Now) + '01';
Query2.Active:=False;
//query2.sql.text:='SELECT NUM_REG,TIPO_POLI,FECHA_POL,NUM_CTA,NUMDEPTO,CONCEP_PO,TIPCAMBIO,DEBE_HABER,NUM_POLIZ,MONTOMOV FROM MO021201';
Query2.Active:=True;

ds1.Active:=True;
Query2.First;
While Not Query2.Eof do
begin
ds1.Insert;
ds1.FieldByName('NUM_CTA').AsString := Query2.fieldbyname('NUM_CTA').AsString;
ds1.FieldByName('NUMDEPTO').AsInteger := Query2.fieldbyname('NUMDEPTO').AsInteger;
ds1.FieldByName('CONCEP_PO').AsString := Query2.fieldbyname('CONCEP_PO').AsString;
ds1.FieldByName('TIPCAMBIO').AsFloat := Query2.fieldbyname('TIPCAMBIO').AsFloat;

if Query2.FieldByName('DEBE_HABER').AsString ='D' then
begin
ds1.FieldByName('DEBE1').AsFloat:=Query2.fieldbyname('MONTOMOV').AsFloat;

end
else if Query2.FieldByName('DEBE_HABER').AsString ='H' then
begin
ds1.FieldByName('DEBE1').AsFloat:=Query2.fieldbyname('MONTOMOV').AsFloat;

end;
ds1.Post;
Query2.Next;
end;

end;
end.

espero que me puedan ayudar porque aun no me muestra nada en los campos nuevos que cree en el clienmtdataset

y tambien muchas gracias por la ayuda hasta el momento