Power Builder - codigos red

 
Vista:

codigos red

Publicado por krlos2385 (39 intervenciones) el 03/10/2007 22:56:30
DESEO IMPLEMENTAR MI SISTEMA EN RED...
EN ESTE SISTEMA TENGO UNA VENTANA DE REGISTROS DE CLIENTE, DENTRO DE ESTA VENTANA SE ENCUENTRA EL BOTON "NUEVO REGISTRO" ... AL HACER CLIC A ESTE BOTON HACE UNA CONSULTA A LA BASE DE DATOS Y METRAE EL ULTIMO CODIGO REGISTRADO Y LE SUMA UNO PARA EL NUEVO CLIENTE QUE SE VA A REGISTRAR... OSEA SI EL ULTIMO CLIENTE ES 00015 EL NUEVO SERA 00016.. SIENDO ESTE CODIGO SU CLAVE PRIMARIA
AHORA MI INQUIETUD ES EN CASO QUE 2 MAQUINAS CLIENTES INTENTAN INGRESAR UN NUEVO CLIENTE AL MISMO TIEMPO... CREARIA UN CONFLICTO DE DUPLICACION DE CODIGO AL MOMENTO DE GUARDAR...PORQ A AMBAS MAQUINAS LE TOCARIA EL CODIGO 00016

COMO PUEDO MANEJAR ESTE TIPO DE PROBLEMA... COMO PUEDO SABER SI OTRA MAQUINA ESTA INTENTADO INGRESAR UN CLIENTE CON EL MISMO CODIGO...
QUE ME RECOMIENDAN PARA ESTE TIPO DE PROBLEMAS...
GRACIAS
CARLOS - PERU
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:codigos red

Publicado por tiroloko (41 intervenciones) el 04/10/2007 01:05:40
CHECA A VER SI TE FUNCIONA ESTO ..

INSER INTO TABLA (ID,NOMBRE)
VALUES (MAX(ID) + 1,:VAR_NOMBRE)

ASI SE INCREMENTARA HASTA QUE INSERTAS EL REGISTRO ..

SUERTE DESDE DGO MEXICO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Respuesta...

Publicado por Leopoldo Taylhardat (710 intervenciones) el 04/10/2007 13:22:29
Saludos desde Maracay, Venezuela..

Tienes dos opciones básicas... buscar antes de grabar cual es el valor máximo de LA COLUMNA e incrementarle 1 para asignarlo... NO TE LA RECOMIENDO...

Segundo... defines que la columna en la BD (no sé cual es la BD que usas) tiene por valor defecto: AUTOINCREMENT, SERIAL o lo que corresponda a la definición de la BD que usas, lo cual permite que la misma BD asigne el valor siguiente cuando haces la inserción del registro...

Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Respuesta...

Publicado por krlos238 (39 intervenciones) el 05/10/2007 23:31:11
no no es AUTOINCREMENT uso sqlserver 2000 este es mi codigo al pulsar el boton nuevo
string ls_codigo
long ll_codigo
select max(right(CLIE_ID,4)) into :ls_codigo from si_cliente;
ll_codigo = long(ls_codigo)
if isnull(ll_codigo) then ll_codigo = 1 else ll_codigo ++

este codigo me pèrmite traer el ultimo numero registrado luego le sumo uno,..
y en el evento open de la ventana hago referencia al boton nuevo .. algo asi

w_ingre_cliente event open()
pb_nuevo. event clicked()

ademas no hago ...insert into ... para grabar mis registros solo hago dw_registro.update() ..

como ven ese es el problema...
Carlos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Respuesta...

Publicado por Leopoldo Taylhardat (710 intervenciones) el 06/10/2007 15:18:17
Saludos...

Eso es lo que te digo que NO HAGAS!

Busca la manera de asignarle el valor por defecto a la columna de la BD para autoinvrementar el código y en tu dw NO TOMAS EN CUENTA esa columna para editar (elimIna la columna en la presentacion de edición), SOLO LA USAS PARA ACTUALIZAR!!!

Espero que me entiendas...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Respuesta...

Publicado por alberto (73 intervenciones) el 08/10/2007 20:59:14
En el formulario de propiedades del update tienes una casilla que te permite elegir cual es la columna denominada Identity. Si seleccionas una columna, el powerbuilder asume que el DBMS asignará automaticamente el valor y se vuelve a hacer un pseudo - retrieve para capturar en tu datawindow el valor correspondiente. OJO. Esto no funciona en TODAS las bases de datos.
Sin embargo, una solución sencilla, a la que tuve que llegar es la siguiente:
Calculo el valor, con el mismo SQL que tienes.
Cuando intento grabar, verifico en el evento dberror si el error que me da es Primary key violated.
En este caso, vuelvo a generar el valor y lo envío nuevamente. Lo hice de esta forma, por que era una base de datos que no tenía identity column.

Otras alternativas son más eficientes.

Una de ellas es tener una tabla donde generas el siguiente valor y lo guardas antes de cada operación. Esto te permite incluso mantener tu numeración sin espacios de secuencia.

Otra es asignar el valor a la columna en un trigger Before Insert (con un SQL o con un sequence). Luego puedes volver a leer este valor, antes de asignarlo a los detalles si es que existen.

Tienes que elegir lo que mejor se adecua a tus necesidades
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar