Ir al contenido


Foto

SQL firebird


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

#1 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 28 mayo 2010 - 09:51

Hola
No se me ocurrio otro nombre. :)
A ver si puedo entender algo:
En access cuando haces una consulta la que servira para hacer un reporte te indica si las tablas no estan enlazadas y tienes que enlazarlas para que puedas hacer la consulta.
Por ejemplo:
Tabla articulos campo CodParte
Tabla FacturaItem campo Codparte.

Si no se enlazan, no se puede hacer el reporte.
Para enlazarlas sale una pantalla donde estan las tablas con sus campos como cuadritos y ahi se definen las dependencias.

Bueno; Despuedes de ver y ver, lo que no entiendo es como lo hace Firebird?, Lo hace?, lo necesita hacer?.

Tengo esta consulta, que creo que me esta dando ese error:


sql
  1. SELECT  Factura.CodFactura, Factura.CodOrdenProd, Factura.Fecha, Factura.CodCliente, Clientes.NombreCliente,
  2. Clientes.Direccion1, Clientes.Direccion2, Clientes.Contacto, Clientes.Telefono, Factura.Terminos,
  3. Factura.OrdenCompra, Factura.CodVendedor, FacturaItem.CodParte, FacturaItem.Impuesto,
  4. MAX (FacturaItem.Serie) AS LastOfSerie,  Descripcion|| ' ' ||Categoria|| ' ' ||SubCategoria AS Descr,
  5. SUM(FacturaItem.Cantidad) AS SumOfCantidad, FacturaItem.Precio, SUM(Cantidad*Precio) AS TotLinea,
  6. Factura.MntSubTotal, Factura.MntDescuento, Factura.MntImpuesto, Factura.MntTotal, Factura.TC, Factura.Tipo
  7. FROM Articulos RIGHT JOIN (Clientes RIGHT JOIN (Factura LEFT JOIN FacturaItem ON (Factura.Tipo = FacturaItem.Tipo)
  8. AND (Factura.CodFactura = FacturaItem.CodFactura) AND (Factura.Secuencia = FacturaItem.Secuencia))
  9. ON Clientes.CodCliente = Factura.CodCliente) ON Articulos.CodParte = FacturaItem.CodParte
  10. GROUP BY Factura.CodFactura, Factura.CodOrdenProd, Factura.Fecha, Factura.CodCliente, Clientes.NombreCliente,
  11. Clientes.Direccion1, Clientes.Direccion2, Clientes.Contacto, Clientes.Telefono, Factura.Terminos,
  12. Factura.OrdenCompra, Factura.CodVendedor, FacturaItem.CodParte,
  13. FacturaItem.Impuesto, Descripcion|| ' ' ||Categoria|| ' ' ||SubCategoria, FacturaItem.Precio,
  14. Factura.MntSubTotal, Factura.MntDescuento, Factura.MntImpuesto, Factura.MntTotal, Factura.TC, Factura.Tipo
  15. HAVING (((Factura.CodFactura)= :fact) AND ((Factura.Tipo)= :TipoFact));



Ya hice que no me diera errores de escritura, pero me sale este error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table ARTICULOS and table FACTURAITEM .
DESCRIPCION.


Para mi es el problema de relacion entre las tablas.
Alguna idea?.
Saludos


  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 mayo 2010 - 09:59

Hola caral, creo que el error está aquí


sql
  1. SUM(Cantidad*Precio) AS TotLinea,



cambialo por


sql
  1. SUM(FacturaItem.Cantidad * FacturaItem.Precio) AS TotLinea,


  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 mayo 2010 - 10:03

Ademas a los campos Descripcion, Categoria y Subcategoria, es mejor colocarles la Tabla mas el punto para evitar ambiguedades.

Saludos
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 mayo 2010 - 10:06

El error es porque en las dos tablas tienes el mismo nombre de campo, debes indicarle exactamente a que tabla te refieres.



sql
  1. .....
  2. Descripcion|| ' ' ||Categoria|| ' ' ||SubCategoria
  3. .....



El campos Descripcion, Categoria y SubCategoria no tienen su Alias o Tabla correspondiente.

Salud OS


PD, Se me adelanto amigo Wilson :)

  • 0

#5 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 28 mayo 2010 - 10:07

Hola
Gracias amigo.
Efectivamente el problema estaba en el campo Descripcion que esta en las dos tablas.
A la hora de concatenar no sabia de que tabla tomarlo (que bruto Firebird jejeje).
Bueno, lo cambie , le puse la tabla articulos y lo hizo.
Ahora sigo teniendo el mismo error, pero ya en el programa.
No se Ni donde esta, ni como solucionarlo.
Saludos



  • 0

#6 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 28 mayo 2010 - 10:14

Hola
Este es el codigo del boton que me da el error que no se, ni donde esta ni como encontrarlo.


delphi
  1. procedure TFFactura.BitBtn4Click(Sender: TObject);
  2. var numfact, i, OrdTrans : integer;
  3.     Fecha, FechaVence, iv: String;
  4.     FPagoOK : Boolean;
  5.     MntContado, MntCheque, MntTarjeta, MntOtros, Saldo, Pagado :String;
  6.     BalanceAnterior, BalanceTotal : Double;
  7.     Tipo :char;
  8. begin
  9.   If cbTipo.ItemIndex = 0 then
  10.   begin
  11.       FFormaPago:=TFFormaPago.Create(self);
  12.       FFormaPago.Valores(SubTotal, Impuesto, Total);
  13.       try
  14.         FFormaPago.ShowModal;
  15.       finally
  16.         FPagoOK := FFormaPago.OK;
  17.         MntContado := FFormaPago.FEContado.Text;
  18.         MntCheque  := FFormaPago.FECheque.Text;
  19.         MntTarjeta := FFormaPago.FETarjeta.Text;
  20.         MntOtros  := FFormaPago.FEOtro.Text;
  21.         Saldo      := FloatToStr(FFormaPago.Saldo);
  22.         Pagado    := FloatToStr(FFormaPago.Pagado);
  23.         FFormaPago.Free;
  24.       end;
  25.       Tipo:= 'F';
  26.   end else
  27.   begin
  28.       FPagoOK := True;
  29.       MntContado := '0';
  30.       MntCheque  := '0';
  31.       MntTarjeta := '0';
  32.       MntOtros  := '0';
  33.       Saldo      := '0';
  34.       Pagado    := '0';
  35.       Tipo := 'C';
  36.   end;
  37.   If FPagoOk then
  38.   begin
  39.     ShortDateFormat := 'yyyy-mm-dd';
  40.     Fecha := DateToStr(now);
  41.     FechaVence := DateToStr(IncDay(now,(StrToInt(Label21.Caption))));
  42.     ShortDateFormat := 'dd/mm/yyyy';
  43.   // Obtener el numero de factura
  44.     QTemp.SQL.Text := 'Select Max(CodFactura) From Factura where Tipo = '+QuotedStr(Tipo);
  45.     QTemp.Open;
  46.     If QTemp.RecordCount = 0 then NumFact:=1
  47.     else NumFact := QTemp.Fields[0].AsInteger+1;
  48.     QTemp.Close;
  49.   //Iniciar la Transaccion
  50.     // DataModule1.AC1.BeginTrans;
  51.     try
  52.     If Edit2.Text <> '' then
  53.   // Insertar en la tabla de Factura Si tiene ORDEN
  54.         QTemp.SQL.Text := 'Insert Into Factura Values '+
  55.           '( '+IntToStr(NumFact)+','+IntToStr(0)+', '+QuotedStr(Tipo)+', '+QuotedStr(Fecha)+', '+Edit1.Text+', '+QuotedStr(Label19.Caption)+', '+QuotedStr(Edit4.Text)+', '+QuotedStr(Edit5.Text)+', '+QuotedStr(Edit3.Text)+
  56.           ', ''N'', '+FloatToStr(0.13)+', ''N'', '+FloatToStr(0.00)+', '+QuotedStr(SGTotal.Cells[1,0])+', '+QuotedStr(SGTotal.Cells[1,1])+', '+
  57.           QuotedStr(SGTotal.Cells[1,2])+', '+QuotedStr(SGTotal.Cells[1,3])+', '+Edit2.Text+', '+QuotedStr(MntContado)+', '+QuotedStr(MntCheque)+', '+
  58.           QuotedStr(MntTarjeta)+', '+QuotedStr(MntOtros)+', '+QuotedStr(Saldo)+', '+QuotedStr(Pagado)+', '+QuotedStr(FloatToStr(TipoCambio))+')'
  59.         else
  60.   // Insertar en la tabla de Factura si NO tiene ORDEN
  61.         QTemp.SQL.Text := 'Insert Into Factura ( CodFactura, Secuencia, Tipo, Fecha, CodCliente, Terminos, OrdenCompra, CodVendedor, Excento, TasaImpuesto, Anulada, MntEnvio, MntSubTotal, MntDescuento, MntImpuesto, MntTotal, '+
  62.         'MntContado, MntCheque, MntTarjeta, MntOtros, Saldo, Pagado, TC) Values '+
  63.           '( '+IntToStr(NumFact)+', '+IntToStr(0)+', '+QuotedStr(Tipo)+', '+QuotedStr(Fecha)+', '+Edit1.Text+', '+QuotedStr(Label19.Caption)+', '+QuotedStr(Edit4.Text)+', '+QuotedStr(Edit5.Text)+', '+QuotedStr(Edit3.Text)+
  64.           ', ''N'', '+FloatToStr(0.13)+', ''N'','+FloatToStr(0.00)+', '+QuotedStr(SGTotal.Cells[1,0])+', '+QuotedStr(SGTotal.Cells[1,1])+', '+
  65.           QuotedStr(SGTotal.Cells[1,2])+', '+QuotedStr(SGTotal.Cells[1,3])+', '+QuotedStr(MntContado)+', '+QuotedStr(MntCheque)+', '+
  66.           QuotedStr(MntTarjeta)+', '+QuotedStr(MntOtros)+', '+QuotedStr(Saldo)+', '+QuotedStr(Pagado)+', '+QuotedStr(FloatToStr(TipoCambio))+')';
  67.         QTemp.ExecSQL;
  68.  
  69.   //Insertar en la tabla de FacturaItem
  70.         For i := 1 to SgFact.RowCount-1 do
  71.         begin
  72.           if SGFact.Cells[6,i] = 'Si' then iv:='True)' else iv:='False)';
  73.           QTemp.SQL.Text := 'Insert Into FacturaItem Values '+
  74.           '( '+IntToStr(numfact)+', '+IntToStr(0)+', '+QuotedStr(Tipo)+', '+IntToStr(i)+', '+QuotedStr(SGFact.Cells[0,i])+', '+QuotedStr(SGFact.Cells[1,i])+', '+QuotedStr(SGFact.Cells[2,i])+', '+QuotedStr(SGFact.Cells[3,i])+', '+
  75.           QuotedStr(SGFact.Cells[4,i])+', '+iv;
  76.           QTemp.ExecSQL;
  77.         end;
  78.   //Calcula el siguiente numero de OrdTrans
  79.         QTemp.SQL.Text := 'SELECT Max(OrdTrans) AS Expr1 '+
  80.                           'FROM CxCobrar;';
  81.         QTemp.Active := True;
  82.         If QTemp.RecordCount = 0 then OrdTrans:=1
  83.         else OrdTrans := QTemp.Fields[0].AsInteger+1;
  84.         QTemp.Close;
  85.  
  86.         If Tipo = 'F' then
  87.         begin
  88.   //  Insertar en la tabla de CxCobrar
  89.           QTemp.SQL.Text := 'Select BalanceTotal From CxCobrar where CodCliente = '+Edit1.Text+
  90.                             ' Order By OrdTrans;';
  91.           QTemp.Open;
  92.           IF QTemp.RecordCount = 0 then BalanceAnterior := 0
  93.           else
  94.           begin
  95.               QTemp.Last;
  96.               BalanceAnterior := QTemp.Fields[0].AsFloat;
  97.           end;
  98.           QTemp.Close;
  99.           BalanceTotal := StrToFloat(Saldo) + BalanceAnterior;
  100.  
  101.           QTemp.SQL.Text := 'Insert Into CxCobrar ( CodTransac, Secuencia, TipoTransac, OrdTrans, FechaTransac, FechaVencimiento, CodCliente, SubTotal, Descuento, Impuesto, Total, Efectivo, Cheque, Tarjeta, Otro, Balance, BalanceTotal, BalanceAnterior, PagosRec, EstadoCuenta )'+
  102.                             ' Values ('+IntToStr(NumFact)+', '+IntToStr(0)+', ''FA'', '+IntToStr(OrdTrans)+', '+QuotedStr(Fecha)+', '+QuotedStr(FechaVence)+', '+Edit1.Text+', '+QuotedStr(SGTotal.Cells[1,0])+', '+QuotedStr(SGTotal.Cells[1,1])+', '+
  103.                             QuotedStr(SGTotal.Cells[1,2])+', '+QuotedStr(SGTotal.Cells[1,3])+', '+QuotedStr(MntContado)+', '+QuotedStr(MntCheque)+', '+
  104.                             QuotedStr(MntTarjeta)+', '+QuotedStr(MntOtros)+', '+QuotedStr(Saldo)+', '+QuotedStr(FloatToStr(BalanceTotal))+', '+QuotedStr(FloatToStr(BalanceAnterior))+', '+IntToStr(0)+','+IntToStr(0)+')';
  105.           QTemp.ExecSQL;
  106.         end;
  107.  
  108.   // Actualizar la tabla de series
  109.         For i := 1 to SgFact.RowCount-1 do
  110.         begin
  111.           if Tipo = 'F' then
  112.               QTemp.SQL.Text := 'Update Series Set NumFactura = '+IntToStr(numfact)+', Estado = ''Facturado'' Where '+
  113.                                 'NumSerie = '+SGFact.Cells[2,i]
  114.           else
  115.               QTemp.SQL.Text := 'Update Series Set NumFactura = '+IntToStr(numfact)+', Estado = ''Consignac'' Where '+
  116.                                 'NumSerie = '+SGFact.Cells[2,i];
  117.           QTemp.ExecSQL;
  118.         end;
  119.  
  120.   // Actualizar la tabla de OrdenProdItem
  121.         For i := 1 to SgFact.RowCount-1 do
  122.         begin
  123.           if Tipo = 'F' then
  124.               QTemp.SQL.Text := 'Update OrdenProdItem Set Estacion = ''Est05'' Where '+
  125.                                 'NumSerie = '+SGFact.Cells[2,i]
  126.           else
  127.               QTemp.SQL.Text := 'Update OrdenProdItem Set Estacion = ''Est06'' Where '+
  128.                                 'NumSerie = '+SGFact.Cells[2,i];
  129.           QTemp.ExecSQL;
  130.         end;
  131.  
  132.   // Actualizar la tabla de Articulos
  133.         For i := 1 to SgFact.RowCount-1 do
  134.         begin
  135.           QTemp.SQL.Text := 'Update Articulos Set Disponible = Disponible - '+SGFact.Cells[3,i]+' Where '+
  136.                             'CodParte = '+QuotedStr(SGFact.Cells[0,i]);
  137.           QTemp.ExecSQL;
  138.         end;
  139.  
  140.   // Actualizar la tabla de Materiales
  141.         For i := 1 to SgFact.RowCount-1 do
  142.         begin
  143.           QTemp.SQL.Text := 'Update Materiales Set Disponible = Disponible - '+SGFact.Cells[3,i]+' Where '+
  144.                             'CodMaterial = '+QuotedStr(SGFact.Cells[0,i]);
  145.           QTemp.ExecSQL;
  146.         end;
  147.  
  148.  
  149.   // Completa la Transaccion
  150.     //  DataModule1.AC1.CommitTrans;
  151.  
  152.   // Imprime la factura si el usuario quiere
  153.       FImprimirFactura:=TFImprimirFactura.Create(self);
  154.       FImprimirFactura.numfact := numfact;
  155.       FImprimirFactura.Tipo := Tipo;
  156.       try
  157.         FImprimirFactura.ShowModal;
  158.       finally
  159.         FImprimirFactura.Free;
  160.       end;
  161.  
  162.   except
  163.         on E:Exception do
  164.         begin
  165.         //  DataModule1.AC1.RollbackTrans;
  166.           MessageDlg('No fue posible completar la transacción, por favor contacte al administrador',mtError,[mbOK],0);
  167.         end;
  168.     end;//try
  169.   end;
  170.   Close;
  171. end;



El error dice:
project .........exception class EIBInterBaseError with message
Conversion error from string ''0'',
process stoped......


No encuentro el Cero por ningun lado.
Cambie todos los ceros por que estaban simplemente asi: 0 por IntToStr(0) en las sentencias, pero nada.

Alguna idea?.
Saludos
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 mayo 2010 - 10:30

El error podría estar aquí


delphi
  1. // Insertar en la tabla de Factura Si tiene ORDEN   
  2.   QTemp.SQL.Text := 'Insert Into Factura Values '+ // No está colocando los nombres de los campos



No estás colocando los nombres de los campos, si no de una los valores
  • 0

#8 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 28 mayo 2010 - 10:32

El error podría estar aquí


delphi
  1. // Insertar en la tabla de Factura Si tiene ORDEN   
  2.   QTemp.SQL.Text := 'Insert Into Factura Values '+ // No está colocando los nombres de los campos



No estás colocando los nombres de los campos, si no de una los valores


Eso es perfectamente válido amigo Wilson, siempre y cuando los valores (values) sean el mismo número que campos en la tabla y estén en el mismo orden... por ahí no va la cosa :(

Saludox ! :)
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 mayo 2010 - 10:32

El error podría estar aquí


delphi
  1. // Insertar en la tabla de Factura Si tiene ORDEN   
  2.   QTemp.SQL.Text := 'Insert Into Factura Values '+ // No está colocando los nombres de los campos



No estás colocando los nombres de los campos, si no de una los valores


Hola Wilson

Se pueden omitir siempre y cuando sean todos los campos de la tabla, con uno solo que no se inserte si es necesario colocar los campos. :)

Salud (b) OS

PD, Vaya hoy estoy muyyyyyyyyy lento, ahora me gano Fena :p
  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 mayo 2010 - 10:59

Hola.

Utiliza el depurador de Delphi, para ejecutar ese código línea a línea.

Así sabrás la línea en que salta ese error, y solo tendremos que revisar el SQL de esa línea y no todo el evento.

NOTA: Una vez localizada la sentencia con error, hemos de buscar un problema en los tipos que estamos usando. Por el error, está claro que intentamos asignar la cadena '0' a un campo que no la admite (por ejemplo, un campo de fecha).
  • 0

#11 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 mayo 2010 - 11:04

Eso es perfectamente válido amigo Wilson, siempre y cuando los valores (values) sean el mismo número que campos en la tabla y estén en el mismo orden... por ahí no va la cosa :(


Aunque sea válido, no es nada recomendable. Puesto que cualquier modificación que hagas a la tabla va a hacer que esta consulta fallo.

Por ejemplo, si añadimos un campo CAMPO_X, que solo se utiliza en un determinado formulario, y solo programamos ese formulario, entonces nos encontraremos que el programa fallará al llegar aquí, a pesar de que para este código el campo CAMPO_X no lo necesita ni lo debe tener en cuenta ni le afecta para nada.

Es mejor poner los campos que vas a modificar, de esta forma la sentencia es más robusta y no va a fallar por hacer cambios en la tabla, como añadir otros campos, cambiar el orden de los campos, etc. ...
  • 0




IP.Board spam blocked by CleanTalk.