Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   ejemplo de insert, drop, delete, update firebir + delphi (https://www.clubdelphi.com/foros/showthread.php?t=81796)

darkbits 17-12-2012 18:14:45

Problemas de UPDATE con firebird
 
Instale firebird 2.5 en un pc windows XP
y la aplicacion lo realizo en Delphi XE un sistema de productos

La base de datos esta configurara asi
DatabaseName:=192.168.0.70:D:\Yupana 2013\Win32\Debug\STORE.GDB


funciona perfectamente cuando 1 sola PC esta utilizando los productos
mi problema es la cuando una 2 o 3ra. .... 5ta PC utiliza el mismo producto
ejemplo. la PC 1 realiza la venta de un MOUSE y descuenta del almacen la cantidad
la PC2 puede vender cualquier otro producto que no sea MOUSE ,
el problema es cuando quieren vender el mismo producto al mismo tiempo.
me sale "deadlock update conflicts with concurrent update concurrent transaction number is 1125"

esto es problema del Firebird?
o es del codigo

posteo lo que esta haciendo el codigo en esta parte
Código Delphi [-]
   /// VAMOS A DESCONTAR EL ALMACEN
  if agregar.Caption='&Modificar' then
     begin
         agregar.Caption:='&Agrega';
         cancelar1.Enabled:= true;
     end;
    _DM.consulta1.SQL.Text:= 'select * From inalmacen Where id_inal='+idprod.text;
    _DM.consulta1.Open;
    _DM.consulta2.SQL.Text:= 'update INALMACEN set cantidad_inal=:auxcantidad_inal Where id_inal='+ idprod.text;
    _DM.consulta2.ParamByName('auxcantidad_inal').Value:=inttostr(strtoint(_DM.consulta1.FieldByName('ca  ntidad_inal').Value) - strtoint(cantidad.Text)) ;
    _DM.consulta2.ExecSQL;
    _DM.consulta2.Close;_DM.consulta1.Close;
    _DM.talmacen.Active:=false;
    _DM.talmacen.Close;
    _DM.talmacen.Active:=true;


end;

recalco que cuando una sola PC, funciona de PELO :) mi problem es cuando varias PC quieren vender el mismo producto y tienen que desconectar de almacen.

tengo esta misma aplicacion con MYSQL y NO tengo problema alguno. funciona en red o como local.

pero necesito en FIREBIRD:

Casimiro Notevi 17-12-2012 18:29:53

Cita:

Empezado por darkbits (Mensaje 451984)
esto es problema del Firebird?
o es del codigo

El problema es tuyo, con tu código :D

Veamos, dices que usas la versión 2.5 y, aunque aquí no lo digas, creo haber leido que ¿usas la versión "embebida"?

darkbits 17-12-2012 18:52:16

en la PC principal windows XP lo instale Firebird-2.5.2.26539_0_Win32.exe

y en las demas PC2 ...PC5 tambien XP coloco Firebird-2.5.2.26539-0_Win32_embed dentro de esa carpeta esta el .exe


cual es mi problema en el codigo ? que no me doy cuenta y posible solucion?

gracias

Casimiro Notevi 17-12-2012 19:15:12

Entonces es la versión "embebida". Ese es el problema. Que esa versión es monousuario.

Si el servidor es windows, entonces instala la versión superserver o superclassic (pero no la classicserver), en todos los equipos.

darkbits 17-12-2012 20:08:54

Gracias Casimiro No entendi esta parte de instalacion porque yo me descargue de la web oficial
y lo instale en WINDOWS XP como Superserver

y en las demas PC NO instale NADA solo descargue la version "embebida" de la misma version y los meti el ejecutable dentro
de que conectan conectan

por favor como seria la forma correcta de instalar
en el winXP como servidor y en las demas PC2....PC5 ?

tengo que instalar el mismo instalador a cada PC ? como superserver


yo utilice Firebird con la idea de no instalar y utilizar "Embebida"

agradesco tu respuesta

Casimiro Notevi 17-12-2012 20:29:19

Bueno, si has instalado la superserver en el servidor, está bien. En los demás PCs instala la "versión cliente" de esa misma versión. Y si no quieres complicarte mucho, instálalo completo, igualmente, como si fuese el servidor.

Para el resto de preguntas, haría falta saber qué componentes de conexión estás usando, los parámetros de las transacciones, etc.

darkbits 17-12-2012 22:03:12

Instale Firebird-2.5.2.26539_0_Win32.exe al servidor y a los 5 CLientes tb Firebird-2.5.2.26539_0_Win32.exe
la version versión superserver

y el problema sigue entonces NO es Firebird
parece ser que mi codigo fuente esta el problema por favor si alguien puede darme una mano como realizar UPDATE en Delphi para firebird estoy realizando asi:
Código SQL [-]
    _DM.consulta1.SQL.Text:= 'select * From inalmacen Where id_inal='+idprod.text;
    _DM.consulta1.Open;
    _DM.consulta2.SQL.Text:= 'update INALMACEN set cantidad_inal=:auxcantidad_inal Where id_inal='+ idprod.text;
    _DM.consulta2.ParamByName('auxcantidad_inal').Value:=inttostr(strtoint(_DM.consulta1.FieldByName('ca  ntidad_inal').Value) - strtoint(cantidad.Text)) ;
    _DM.consulta2.ExecSQL;
    _DM.consulta2.Close;
    _DM.consulta1.Close;
    _DM.talmacen.Active:=false; // false y true lo realizo para  actualizar no se si hay otra mejor forma.
    _DM.talmacen.Close;
    _DM.talmacen.Active:=true;

Caral 17-12-2012 22:14:48

Hola
Si hay algo que he aprendido de firebird es que se molesta cuando las cantidades estan en texto.
Te aconsejo que pongas las cantidades en variables float o integer.
Saludos

darkbits 17-12-2012 22:25:48

todo marcha bien

me da error cuando le toca esta linea

_DM.consulta2.ExecSQL;




Código SQL [-]
  _DM.consulta1.SQL.Text:= 'select * From inalmacen Where id_inal='+idprod.text;
    _DM.consulta1.Open;
    _DM.consulta2.SQL.Text:= 'update INALMACEN set cantidad_inal=:auxcantidad_inal Where id_inal='+ idprod.text;
    _DM.consulta2.ParamByName('auxcantidad_inal').Value:=inttostr(strtoint(_DM.consulta1.FieldByName('ca  ntidad_inal').Value) - strtoint(cantidad.Text)) ;
    _DM.consulta2.ExecSQL;
    _DM.consulta2.Close;
    _DM.consulta1.Close;
    _DM.talmacen.Active:=false; // false y true lo realizo para  actualizar no se si hay otra mejor forma.
    _DM.talmacen.Close;
    _DM.talmacen.Active:=true;

Caral 17-12-2012 22:26:48

Hola
Si toca esa linea es entonces la anterior.
Como dije antes.
Saludos

Casimiro Notevi 17-12-2012 22:32:17

Es que sin saber lo que son esas variables, lo que estás haciendo, ni el contexto de tu código... es difícil ayudarte. A ver...
¿id_inal es texto o número?, acláralo
¿auxcantidad_inal es texto o número?, acláralo

Suponiendo que ambos son números (como debe ser) y haciendo las cosas paso a paso:

Código Delphi [-]
var
  fCantidad : double;
  iAlmacen : integer;
begin
  iAlmacen := strtoint(idprod.text);
  
  _DM.consulta1.Close;  // tienes que cerrarlo antes de cambiarle la sentencia que contiene
  _DM.consulta1.SQL.Text:= 'select * From inalmacen Where id_inal='+iAlmacen;
  _DM.consulta1.Open;
    
  fCantidad := _DM.consulta1.FieldByName('cantidad_inal').Value - strtoFloat(cantidad.Text));
  _DM.consulta1.Close;  // lo cerramos en cuanto ya no hace falta

  _DM.consulta2.Close;  // usamos los 2 parámetros ¿por qué sólo 1 y el otro no?
  _DM.consulta2.SQL.Text:= 'update INALMACEN set cantidad_inal=:auxcantidad_inal where id_inal= :auxid_inal';
  _DM.consulta2.ParamByName('auxcantidad_inal').Value := fCantidad;
  _DM.consulta2.ParamByName('auxid_inal').Value := iAlmacen;
  _DM.consulta2.ExecSQL;  // No has dicho qué componentes usas, así que supongo que los IBX
  _DM.consulta2.Transaction.commitretaining;  // Ni idea de las transacciones porque tampoco has contestado a lo que pregunté antes
  _DM.consulta2.Close;
end;

cloayza 19-12-2012 01:51:45

Cita:

Empezado por Casimiro Notevi (Mensaje 451996)
Bueno, si has instalado la superserver en el servidor, está bien. En los demás PCs instala la "versión cliente" de esa misma versión. Y si no quieres complicarte mucho, instálalo completo, igualmente, como si fuese el servidor.

Para el resto de preguntas, haría falta saber qué componentes de conexión estás usando, los parámetros de las transacciones, etc.

Junto con el ejecutable de los clientes debes tener la gds32.dll o fbclient.dll para atacar al server.

Saludos

darkbits 19-12-2012 03:48:02

ejemplo de insert, drop, delete, update firebir + delphi
 
un saludo al club

estoy trabajando con firebird 2.5 en XE 2
en una PC XP

busque en los depositos del club y no encuentro algo espesifico. encontre para access, Mysql pero para firebird no encontre lo que busco.

y quiero pedir un favor si pueden facilitare algun ejemplo de firebir con dephi component IBX no importa si el ejemplo es super sencillo es lo que quiero para entender
que contengan ejemplos insert, drop, delete, update, y que este pueda funcionar en red

quiero tener idea como se hace esto porque supongo que no es hacer una aplicacion monousuario q para en red. yo tengo mi aplicacion como monousuario fucniona super en red me da problemas cuando realizo insert o udate.

ecfisa 19-12-2012 05:18:10

Hola darkbits.

En este enlace, (Delphi, conexión a firebird con componentes IBX), se explica paso a paso desde la conexión con Firebird hasta las acciónes que consultas para los componentes TIBQuery y TIBDataSet.

Saludos. :)

Neftali [Germán.Estévez] 19-12-2012 09:40:25

También hay que comentar que las acciones que pides (INSERT, DROP, DELETE, UPDATE,...) entiendo que son sentencias SQL, por lo tanto no dependen (casi nada) de los componentes que utilices y de la Base de Datos.

Si revisas ejemplos de SQL (aunque no sean IBX+FB) deberían servirte para saber cómo se utilizan.

darkbits 19-12-2012 13:17:12

yo utilizo (INSERT, DROP, DELETE, UPDATE,...) para MYSQL en win XP como monousuario en red me funciona de maravilla

pero cuando utilizo en firebird 2.5 win Windows XP como monousuario tambien funciona de maravilla
cuando lo coloco en RED ahi se me cuelga cuando realizo la misma accion en 2 PC

estoy utilizando (INSERT, DROP, DELETE, UPDATE,...) para firebird
vi lo que me recomienda ecfisa y si voy a ese paso y realizo como dice el manual.

pero please necesito ejemplos firebir don Delphi si conocen algun LINK

Casimiro Notevi 19-12-2012 14:08:51

¿No dijiste que usabas la versión de firebird "embebida"?, esa es monousuario.

darkbits 19-12-2012 15:15:12

en el servidor XP eh utilizado firebird Instalacion completa
en las demas PC XP utilice firebird "embebida" pero me recomendaron utilizar Instalacion Completa como el servidor
y sigo con el problema

llego a la conclusion q mi problema esta en mi codigo

Neftali [Germán.Estévez] 19-12-2012 15:50:48

Cita:

Empezado por darkbits (Mensaje 452111)
...pero cuando utilizo en firebird 2.5 win Windows XP como monousuario tambien funciona de maravilla
cuando lo coloco en RED ahi se me cuelga cuando realizo la misma accion en 2 PC

¿Puedes explicar un poco con más detalle, qué significa "se me cuelga"?
Sin tener en cuenta otros datos, eso parece tema de transacciones y bloqueos, pero das pocos datos del problema.
¿Puedes describirlo mejor y poner algo de código?

darkbits 19-12-2012 16:05:24

Gracias Neftali por tu interes

tengo una aplicacion de venta de productos de PC

cuando realizo la venta de un producto en red de cualquier punto funciona OK
el problema es cuando realizo la venta del mismo producto en mas de 2 diferentes puntos las PC se quedan sin funcionar el sistema ( colgado del sistema) hasta presionar ctrl + alt+ sup y reiniciar y si vendo otro producto q no sea el mismo si funciona.

llege a la conclusion el sistema solo funciona para solo en 1 PC y no me funciona en red para varias PC

No puedo realizar la misma accion en mas de 2 o mas PC

ese es mi problem todos estan con firebird instalacion como servidor en windows XP y esta programado en XE2 con IBX

:( por ello busco ejemplos de programitas pequeños de (INSERT, DROP, DELETE, UPDATE,...) para ver como se hace y corregir.

Lo raro es que utilizo el mismo con db MYSQL y funciona de maravilla en una PC o en 3 o mas PC


este es el codigo donde se bloquea el sistema:


Código SQL [-]
   _DM.consulta1.SQL.Text:= 'select * From inalmacen Where id_inal='+idprod.text;
    _DM.consulta1.Open;
    _DM.consulta2.SQL.Text:= 'update INALMACEN set cantidad_inal=:auxcantidad_inal Where id_inal='+ idprod.text;
    _DM.consulta2.ParamByName('auxcantidad_inal').Value:=inttostr(strtoint(_DM.consulta1.FieldByName('ca  ntidad_inal').Value) - strtoint(cantidad.Text)) ;
    _DM.consulta2.ExecSQL; // ejecuo la consulta y  AQUI ES EL PROBLEMA SE QUEDA EN STOP CUANDO HAY MAS DE 2 PC
    _DM.consulta2.Close;

DATA Module dond esta la DB= _DM


gracias.


La franja horaria es GMT +2. Ahora son las 07:20:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi