correlativo documento con ado y mysql

Post Reply
User avatar
lafug
Posts: 185
Joined: Thu Nov 17, 2005 12:48 am
Location: Santiago, Chile

correlativo documento con ado y mysql

Post by lafug »

Hola a todos!
(correlativo documento con ado y mysql)

Tengo dos usuarios ingresando un documento, al entrar ambos toman el correlativo 1, la idea es que al momento de grabar ambos al mismo tiempo, el sistema verifique que no se han grabado ambos con el 1.
en el prg coloqué antes de grabar en la DB, una una consulta a la tabla verificando si existe el numero "1" entonces si existe le sumo 1 vuelvo a verificar hasta que no exista y ahi el programa realiza la grabación, pero no me ha funcionado, al parecer el servidor no está bloqueando la tabla cuando un usuario entra primero.
codigo:
DO WHILE .T.
IF !BUSCA_X("SELECT numero_documento FROM ventas where numero_documento ="+ALLTRIM(STR(mi_numero)) , oCon,"numero")
EXIT
else
++n_numero
endif
ENDDO
oRS:AddNew()
oRS:Fields("numero_documento"):value := n_numero
oRS:Fields("tipo_documento"):value := c_tipo_doc
oRS:Fields("fecha"):value := cTod(c_dia+"/"+c_Mes+"/"+c_Ano)
....
oRS:Update() /// aqui graba el documento

GRACIAS POR SUS COMENTARIOS!!
Luis Alfonso Fuentes Guerrero
FWH 11.06 xHarbour 1.2.1 BCC55 WorkShop
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: correlativo documento con ado y mysql

Post by Daniel Garcia-Gil »

Saludos

Mysql tiene herramientas que te facilitan el trabajo, es importante dejar de pensar en DBF cuando se trabaja en MySql

el campo que se incrementa declaralo como auto incrementable, haz los insert sin problemas MySql se encargara de asignarle a cada quien el que le corresponda, para recuperar en cada caso el insert incluido puedes ejecutar "select last_insert_id() as ultimo_id"
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
russimicro
Posts: 179
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: correlativo documento con ado y mysql

Post by russimicro »

// RUTINA CON PHP... PERO LA PUEDE ADAPTAR..
try {
$conn->beginTransaction();

bloqueaTablaConsecutivo($conn,1);

$noExiste = true;
if ( $cDocTra == "") { // para registros nuevos.. le asignq el consecutivo
while ( $noExiste ) {
$nDocGra = buscaConsecutivo($cEmpSuc,$cCodCon,$conn,$codigoConsecutivo);
$cDocGra = str_repeat(" ", 8 - strlen( trim((string)$nDocGra) ) ). trim((string)$nDocGra) ;
$stmt=$conn->prepare($cSenEje);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute(array($cEmpSuc,$cCodCon,$cDocGra));
$registros = $stmt->rowCount();
unset($stmt);

if ($registros > 0) {
actualizaConsecutivo($conn,$codigoConsecutivo) ;
$nDocGra = ( $nDocGra + 1 );
} else {
$noExiste = false;
};
}
};
$conn->commit();
} catch(PDOException $e) {
$conn->rollBack();
bloqueaTablaConsecutivo($conn,0) ;
$controlConsecutivo = false;
$cDocTra = "0";
$msg = true;
// Report errors
};

bloqueaTablaConsecutivo($conn,0) ;


//****************************


function bloqueaTablaConsecutivo($conn,$lBloTab) {
$cSenEje = "UNLOCK TABLES;";
if ( $lBloTab == 1 ) {
$cSenEje = "LOCK TABLES consecutivos AS sec WRITE, transainventarios WRITE, conceptosinventarios AS con WRITE;";
};
$stmt=$conn->prepare($cSenEje);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
$registros = $stmt->rowCount();
unset($stmt);
}

//*************************************************************

function actualizaConsecutivo($conn,$codigo) {

$registros = 0;
$estado = false;
$cSenEje = "UPDATE consecutivos sec " ;
$cSenEje .= "SET sec.nnumerosec = sec.nnumerosec + 1 " ;
$cSenEje .= " WHERE sec.ccodigosec = ?;";

$stmt=$conn->prepare($cSenEje);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute(array($codigo));
$registros = $stmt->rowCount();
unset($stmt);

if ( $registros > 0 ) {
$estado = true;
}
return $estado;
}

//******************************************************************
User avatar
lafug
Posts: 185
Joined: Thu Nov 17, 2005 12:48 am
Location: Santiago, Chile

Re: correlativo documento con ado y mysql

Post by lafug »

DANIEL,

Probaré eso, pero se podrá hacer diferenciado para tipo de documento dentro de la misma tabla?, es decir, yo tengo en la misma tabla factura y nota de crédito, entonces necesito que se auto-incrementen de manera independiente, por ejemplo si parto con la nota de credito 1 y factura 1, al momento de ingresar la factura 2, solo se incremente la factura.

GRACIAS POR TUS COMENTARIOS
Luis Alfonso Fuentes Guerrero
FWH 11.06 xHarbour 1.2.1 BCC55 WorkShop
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: correlativo documento con ado y mysql

Post by joseluisysturiz »

Si quieres usar diferentes tipos de documentos deberias crear un key secundario por tipó de documento para hacer juego con el numero del documento, aunque yo te recomendaria para un mejor control que te crees una tabla de un solo registro, en mi caso lo llamo..CONFIG...y alli crees campos por tipo de documento, FACTURA, PEDIDOS, NOTAS DE ENTREGA, etc...este campo lo tengo de tipo INT de 5o puedes usar DECIMAL de mas cantidad, y lo controlo que cuando voy a grabar el documento X, incremento su valor en la tabla CONFIG y ese valor sera el que le corresponda, asi se le asigna al que grabe de primero, en este caso un sistema de varios usuarios realizando el mismo tipo de documento, espero me hayas entendido y si no, avisame y te mando el sample de como lo hago, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: correlativo documento con ado y mysql

Post by Daniel Garcia-Gil »

lafug wrote:DANIEL,

Probaré eso, pero se podrá hacer diferenciado para tipo de documento dentro de la misma tabla?, es decir, yo tengo en la misma tabla factura y nota de crédito, entonces necesito que se auto-incrementen de manera independiente, por ejemplo si parto con la nota de credito 1 y factura 1, al momento de ingresar la factura 2, solo se incremente la factura.

GRACIAS POR TUS COMENTARIOS
solo puede haber un campo auto incrementable en las tablas

para darte un mejor soporte es mejor saber las tablas y la cardinalidad que hay entre ellas, con la informacion que colocas intentare darte un ejemplo segun lo que entiendo.

existes 2 tablas, tabla_nota_de_credito y tabla_facturas
cardinalidad seria:
tabla_nota_de_credito (1::n) tabla_facturas
tabla_facturas (1::[0-1]) tabla_nota_de_credito

Por cada nota de credito existira por lo menos una factura y una factura puede o no tener una nota de credito, teniendo eso claro, podriamos incluir en la tabla_factura un campo llamado nota_de_credito_id que puede ser NULL o contener el id de alguna nota de credito, puedes crear una llave foranea en tabla_factura apuntado a tabla_nota_de_credito, restingiendo el borrado (ON DELETE RESTRICT) eso evita borrar la nota de credito si existe alguna factura asociada,

ahora puedes incluir la nota de credito, obtener el id con last_insert_id y asignarselo a la factura (que ya ha sido creada)
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Post Reply