Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-05-2004
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
Inserciones directas en Maestro-Detalle

Hola a todos.

Mi problema es el siguiente y no sé si lo estoy haciendo bien y a ver si me pueden ayudar en otras cosillas.

Trabajo con Interbase 6.0, me creo las inserciones, modificaciones y borrados a través de código, osea:

var
ISQL : TIBSQL;
begin
ISQL := TIBSQL.Create(Nil);
.....
ISQL.SQL.Text := 'insert into xxxx ...
.....
CommitRetaining;
end;

El caso es que cuando es maestro detalle no sé el identificador del maestro (es autonumérico) y hago lo siguiente:

Query.SQL.Text := 'Select max(id_xxx) as id from tabla';

lo guardo en una variable y lo inserto en los detalles.
¿Está bien echo esto? ¿Hay otra manera más correcta?
¿Está bien si en la base de datos pueden trabajar varios usuario a la vez?


Otro problema que tengo está relacionado con lo mismo.
Tengo una aplicación cliente-servidor, los clientes envían la información en un fichero de texto de la forma:

insert into tabla(...) values (...);
update tabla set xxxx = 'xxxx' where ppp = 'dkd';
etc

Mi problema viene cuando me envían datos maestro-detalle, lo que hago es cargar el fichero directamente a través de un IBSQL y ejecutarlo, pero cuando hay maestros detalles no sé cómo hacer para que los detalles sepan el identificador de maestro, tanto si modifico como si inserto.

No sé si me habré explicado lo suficientemente bien, pero espero que me puedan ayudar.

Gracias por todo.
Responder Con Cita
  #2  
Antiguo 22-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Hola. Si hay acceso multiusuario, el select max(id) no te garantiza que te devuelva el registro insertado por vos... es el último registro confirmado en la BD.

Me imagino que por autonumerico te referis a que estas usando un generador para obtener el ID, en un trigger BeforeInsert. El inconveniente de esto es precisamente no saber el ID de vuelta en la aplicación. Es mejor obtener el ID antes de lanzar la sentencia al servidor en tu propia aplicación.

Esto lo podes hacer fácilmente con un StoredProcedure que simplemente llame a gen_id para tu generador y devuelva el valor generado. Luego usas ese ID para insertar tanto el maestro como sus detalles

me explique??

Ahora, sinceramente, la segunda pregunta no la entendí. Si es una aplicación cliente/servidor, no veo porque utilizar un archivo de texto de por medio... y mucho menos entiendo lo que queres hacer...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 22-05-2004
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
Gracias Jachguate.

· El primer punto perfecto. Y si estoy trabajando con tablas de access? Cómo hago para sacar el valor?.

· El segundo punto: el archivo de texto es para enviar los datos a la aplicación que se encuentra en la Web, (sé que lo puedo hacer de mil maneras, pero con esto de las prisas no tengo tiempo para investigar nuevas opciones, y aquí de momento solo me e encontrao con éste problema). Lo que me pasa es lo mismo en una aplicación me crea sus valores autonuméricos y en la otra otros valores, supongamos:

Pedidos
Id_Pedidos, fecha, etc
Lineas de Pedidos
Id_Lineas_Pedidos, Id_Pedidos, codigo_articulo, etc

El problema es que Id_Pedidos (Pedidos) en local es un número cualquiera, pero en la Web se guardará otro número cualquiera, el problema, al cargar las Líneas ya no me va a coincidir Id_Pedidos.

No sé si me e explicao.

Gracias y hasta luego.
Responder Con Cita
  #4  
Antiguo 22-05-2004
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
Perdona jachguate.

En el tema del stored procedure, para hacer la inserción se puede hacer a través de un stored y hacer que me devuelva el valor?

Gracias
Responder Con Cita
  #5  
Antiguo 22-05-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Es muy sencillo. Solo tienes que añadir un parámetro de salida (los parámetros más habituales són los de entrada) :

Ejplo. :

Código:
SET TERM ^ ;
 
CREATE PROCEDURE "Anadir_Cliente" (NOMBRE VARCHAR(50), APELLIDOS VARCHAR(50))
RETURNS (ID INTEGER)
AS
begin
ID = gen_id(Generador_CLIENTE, 1);
 
insert into CLIENTES (ID, NOMBRE, APELLIDOS) values (:ID, :NOMBRE, :APELLIDOS);
end
^
 
SET TERM ; ^
Ejplo. de utilización en Delphi, y recuperación del código :

Código:
function Anadir_Cliente(Nombre: string; Apellidos: string): integer;
begin
  spAnadir_Cliente.Params.ParamValues['NOMBRE'] := Nombre;
  spAnadir_Cliente.Params.ParamValues['APELLIDOS'] := Apellidos;
  spAnadir_Cliente.ExecProc;
  Result := spAnadir_Cliente.Params.ParamValues['ID'];
end;
Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 22-05-2004 a las 15:17:25.
Responder Con Cita
  #6  
Antiguo 24-05-2004
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
Gracias GuillotMarc por responder.

Efectivamente es como me dices. El otro día estaba un poco ofuscado, pero bueno. Todo lo que comentas es cierto.

¿Cómo podría hacer lo mismo, pero con Access?

Ahí ya me pierdo un poco.

Saludos y Gracias.
Responder Con Cita
  #7  
Antiguo 24-05-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola.

Pues en Access, yo insertaria el registro, y después haría una consulta del tipo Select Max(Codigo) ...

No se puede hacer mucho más en Access.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:06:02.


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
Copyright 1996-2007 Club Delphi