Ir al contenido


Foto

Problema con una consulta en lazarus + firebird


  • Por favor identifícate para responder
2 respuestas en este tema

#1 robert01

robert01

    Advanced Member

  • Miembros
  • PipPipPip
  • 162 mensajes
  • LocationArgentina

Escrito 13 abril 2011 - 12:07

Hola amigos, tengo un problema en una parte del código de un programa en Lazarus.

El código original está en delphi 7 y corre sin ningún error.

Tengo una base de datos Firebird que tiene entre otras tablas las siguientes:



delphi
  1. PRODUCTO:
  2.  
  3. CREATE TABLE PRODUCTO (
  4.     PROD_COD      VARCHAR(25) NOT NULL,
  5.     PROD_GRUPO    VARCHAR(20),
  6.     DESCR_PROD    VARCHAR(50),
  7.     PROVEEDOR    VARCHAR(40),
  8.     UNIDAD        CHAR(2),
  9.     PRECIOCOMPRA  NUMERIC(18,2),
  10.     MARGEN        NUMERIC(4,2),
  11.     PRECIOVENTA  NUMERIC(18,2),
  12.     REPOSICION    NUMERIC(5,3),
  13.     STOCKGRAL    NUMERIC(5,3),
  14.     FECHAFABRIC  DATE,
  15.     FECHAVENC    DATE,
  16.     ESPECIFIC    VARCHAR(255),
  17.     PRIMARY KEY (PROD_COD)
  18. );
  19.  
  20. CREATE INDEX PRODGRP_IDX1 ON PRODUCTO (PROD_GRUPO);
  21. CREATE INDEX PROD_IDX1 ON PRODUCTO (DESCR_PROD);
  22.  
  23.  
  24. PROVEEDOR
  25.  
  26. CREATE TABLE PROVEEDOR (
  27.     PROV_COD    INTEGER NOT NULL,
  28.     RAZONSOCIAL  VARCHAR(40) NOT NULL,
  29.     NOM_FICT    VARCHAR(40),
  30.     DIRECCION    VARCHAR(50),
  31.     BARRIO      VARCHAR(35),
  32.     CIUDAD      VARCHAR(35),
  33.     PROVINCIA    CHAR(3),
  34.     CP          VARCHAR(12),
  35.     TELEFONO    VARCHAR(18),
  36.     FAX          VARCHAR(18),
  37.     SITIO        VARCHAR(40),
  38.     EMAIL        VARCHAR(40),
  39.     OBSERV      VARCHAR(255),
  40.     PRIMARY KEY (PROV_COD)
  41. );
  42. CREATE INDEX PROV_IDX1 ON PROVEEDOR (NOM_FICT);



Trato de hacer una consulta, tengo un radiogroup con dos items

producto por proveedor
proveedor por producto

Aparte de eso tengo un TDBLookupComboBox que me permite seleccionar los elementos 

para filtrar, los que se muestran en un dbgrid.

El problema surge cuando trato de cambiar la opción de la consulta de producto por

proveedor a proveedor por producto, pone lo siguiente

TblRegProducto: Field not found: "NOM_FICT"

Press OK to ignore and risk data corruption

etc

y si trato de usar el combobox surge el siguiente mensaje:

Dynamic SQL Error
SQL erro code = -206
Column unknown
NOM_FICT
At line 2, column 8


Uso MDOMercuryTable en un datamodule TblRegProveedor tiene Tablename = PROVEEDOR

y TblRegProdcuto tablename PRODUCTO



delphi
  1.   TFrmProdProv = class(TForm)
  2.     TxtProvProd: TDBText;
  3.     Panel1: TPanel;
  4.     RadioGroup1: TRadioGroup;
  5.     Label1: TLabel;
  6.     Label2: TLabel;
  7.     TxtBuscProvProd: TDBLookupComboBox;
  8.     Panel2: TPanel;
  9.     DsConsProd: TDataSource;
  10.     DBGrid1: TDBGrid;
  11.     Label3: TLabel;
  12.     btnOtConProdProv: TBitBtn;
  13.     btnCerrConProdProv: TBitBtn;
  14.     DsProvProdProv: TDatasource;
  15.     procedure RadioGroup1Click(Sender: TObject);
  16.     procedure TxtBuscProvProdClick(Sender: TObject);
  17.     procedure btnOtConProdProvClick(Sender: TObject);
  18.     procedure btnCerrConProdProvClick(Sender: TObject);
  19.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  20.     procedure TxtBuscProvProdEnter(Sender: TObject);
  21.   private
  22.     { Private declarations }
  23.   public
  24.     { Public declarations }
  25.   end;
  26.  
  27. var
  28.   FrmProdProv: TFrmProdProv;
  29.  
  30. implementation
  31.  
  32. uses uDM;
  33.  
  34. {$R *.lfm}
  35.  
  36. procedure TFrmProdProv.RadioGroup1Click(Sender: TObject);
  37. begin
  38.   DM.dbSG.Open;
  39.   DM.TblRegProveedor.Active:=True;
  40.   DM.TblRegProducto.Active:=True;
  41.  
  42.   If RadioGroup1.ItemIndex = 0 Then
  43.   begin
  44.  
  45.     TxtBuscProvProd.ListField:='';
  46.     TxtBuscProvProd.KeyField:='';
  47.     Label1.Caption:='Consulta Producto por Proveedor';
  48.     TxtBuscProvProd.ListSource:=DsProvProdProv;
  49.     TxtBuscProvProd.ListField:='NOM_FICT';
  50.     TxtBuscProvProd.KeyField:='NOM_FICT';
  51.     DBGrid1.Columns[0].Title.Caption:='Código';
  52.     DBGrid1.Columns[1].Title.Caption:='Producto';
  53.     DBGrid1.Columns[0].FieldName:='PROD_COD';
  54.     DBGrid1.Columns[0].Width:=110;
  55.     DBGrid1.Columns[1].Width:=538;
  56.     DBGrid1.Columns[1].FieldName:='DESCR_PROD';
  57.     DBGrid1.Columns[1].Visible:=True;
  58.     DBGrid1.Columns[2].Visible:=False;
  59.     Label2.Caption:='Buscar Proveedor';
  60.     Label3.Caption:='Proveedor';
  61.   end
  62.   else
  63.   If RadioGroup1.ItemIndex = 1 Then
  64.   begin
  65.  
  66.     TxtBuscProvProd.ListField:='';
  67.     TxtBuscProvProd.KeyField:='';
  68.     Label1.Caption:='Consulta Proveedor por Producto';
  69.  
  70.     TxtBuscProvProd.ListSource:=DsConsProd;
  71.     TxtBuscProvProd.ListField:='DESCR_PROD';
  72.     TxtBuscProvProd.KeyField:='DESCR_PROD';
  73.  
  74.     DBGrid1.Columns[0].Title.Caption:='Proveedor';
  75.     DBGrid1.Columns[0].FieldName:='PROVEEDOR';
  76.     DBGrid1.Columns[0].Width:=646;
  77.     DBGrid1.Columns[1].Visible:=false;
  78.     DBGrid1.Columns[2].Visible:=False;
  79.     Label2.Caption:='Buscar Producto';
  80.     Label3.Caption:='Producto';
  81.  
  82.   end;
  83.  
  84.  
  85. end;
  86.  
  87. procedure TFrmProdProv.TxtBuscProvProdClick(Sender: TObject);
  88. begin
  89.   If RadioGroup1.ItemIndex = 0 Then
  90.   begin
  91.     TxtProvProd.DataSource:=DsConsProd;
  92.     TxtProvProd.DataField:='PROVEEDOR';
  93.     DM.TblRegProducto.Filtered:=True;
  94.     DM.TblRegProducto.Filter:='PROVEEDOR='+QuotedStr(TxtBuscProvProd.Text);
  95.   end
  96.   else
  97.   If RadioGroup1.ItemIndex = 1 Then
  98.   begin
  99.     TxtProvProd.DataSource:=DsConsProd;
  100.     TxtProvProd.DataField:='DESCR_PROD';
  101.     DM.TblRegProducto.Filtered:=True;
  102.     DM.TblRegProducto.Filter:='DESCR_PROD='+QuotedStr(TxtBuscProvProd.Text);
  103.   end;
  104.  
  105. end;                             
  106.  
  107. procedure TFrmProdProv.btnOtConProdProvClick(Sender: TObject);
  108. begin
  109.   DM.TblRegProducto.Filtered:=False;
  110.   DM.TblRegProducto.Filter:='';
  111.   TxtBuscProvProd.SetFocus;
  112.   TxtBuscProvProd.DroppedDown;
  113. end;
  114.  
  115. procedure TFrmProdProv.btnCerrConProdProvClick(Sender: TObject);
  116. begin
  117.   DM.TblRegProducto.Filtered:=False;
  118.   DM.TblRegProducto.Filter:='';
  119.   DM.TblRegProducto.Active:=False;
  120.   DM.dbSG.Close;
  121.   FrmProdProv.Close;
  122. end;
  123.  
  124. procedure TFrmProdProv.FormClose(Sender: TObject;
  125.   var Action: TCloseAction);
  126. begin
  127.   Action:= CaFree;
  128.   FrmProdProv:= NIL;
  129. end;
  130.  
  131. procedure TFrmProdProv.TxtBuscProvProdEnter(Sender: TObject);
  132. begin
  133.   If RadioGroup1.ItemIndex = 0 Then
  134.   begin
  135.     DM.TblRegProveedor.Last;
  136.     DM.TblRegProveedor.First;
  137.   end
  138. end;               



Si hago una de las dos formas de consulta comentadno el código d ela otra todo anda bien. No se que es lo que no veo que hice mal.

Saludos y gracias

  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 13 abril 2011 - 03:08

Se me ocurre que podría faltarte un close antes de cambiar algo en los componentes, quizas el problema surja solo la segunda vez que eliges algo y no la primera, y que si comentas el código como solo haces un tipo de consulta y no hay cambios, la necesidad de hacer un close no se note.

Desconozco exactamente como van estos componentes, pero yo intentaria este cambio:



delphi
  1. procedure TFrmProdProv.RadioGroup1Click(Sender: TObject);
  2. begin
  3.  
  4.   DM.dbSG.Close; //Quizas solo falte esto, pero igual no es este el punto...
  5.  
  6.   DM.dbSG.Open;
  7.   DM.TblRegProveedor.Active:=True;
  8.   DM.TblRegProducto.Active:=True;
  9.  
  10.   DM.dbSG.Close; //Quizas aqui funcione mejor, al final abria que abrir y activar todo.
  11.  
  12.   If RadioGroup1.ItemIndex = 0 Then
  13.   begin
  14.  
  15.     TxtBuscProvProd.ListField:='';
  16.     TxtBuscProvProd.KeyField:='';
  17.     Label1.Caption:='Consulta Producto por Proveedor';
  18.     TxtBuscProvProd.ListSource:=DsProvProdProv;
  19.     TxtBuscProvProd.ListField:='NOM_FICT';
  20.     TxtBuscProvProd.KeyField:='NOM_FICT';
  21.     DBGrid1.Columns[0].Title.Caption:='Código';
  22.     DBGrid1.Columns[1].Title.Caption:='Producto';
  23.     DBGrid1.Columns[0].FieldName:='PROD_COD';
  24.     DBGrid1.Columns[0].Width:=110;
  25.     DBGrid1.Columns[1].Width:=538;
  26.     DBGrid1.Columns[1].FieldName:='DESCR_PROD';
  27.     DBGrid1.Columns[1].Visible:=True;
  28.     DBGrid1.Columns[2].Visible:=False;
  29.     Label2.Caption:='Buscar Proveedor';
  30.     Label3.Caption:='Proveedor';
  31.   end
  32.   else
  33.   If RadioGroup1.ItemIndex = 1 Then
  34.   begin
  35.  
  36.     TxtBuscProvProd.ListField:='';
  37.     TxtBuscProvProd.KeyField:='';
  38.     Label1.Caption:='Consulta Proveedor por Producto';
  39.  
  40.     TxtBuscProvProd.ListSource:=DsConsProd;
  41.     TxtBuscProvProd.ListField:='DESCR_PROD';
  42.     TxtBuscProvProd.KeyField:='DESCR_PROD';
  43.  
  44.     DBGrid1.Columns[0].Title.Caption:='Proveedor';
  45.     DBGrid1.Columns[0].FieldName:='PROVEEDOR';
  46.     DBGrid1.Columns[0].Width:=646;
  47.     DBGrid1.Columns[1].Visible:=false;
  48.     DBGrid1.Columns[2].Visible:=False;
  49.     Label2.Caption:='Buscar Producto';
  50.     Label3.Caption:='Producto';
  51.  
  52.   end;
  53.  
  54.   //Si se usa el close en la 2a posicion, toca reabrir todo aqui
  55.   DM.dbSG.Open;
  56.   DM.TblRegProveedor.Active:=True;
  57.   DM.TblRegProducto.Active:=True;



No se si va por aqui el problema, pero pruebalo a ver...
  • 0

#3 robert01

robert01

    Advanced Member

  • Miembros
  • PipPipPip
  • 162 mensajes
  • LocationArgentina

Escrito 13 abril 2011 - 04:16

Efectivamente Sergio, probé la segunda forma y anda OK.
  • 0




IP.Board spam blocked by CleanTalk.