correlativo documento con ado y mysql

correlativo documento con ado y mysql

Postby lafug » Wed Nov 12, 2014 5:16 pm

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
lafug
 
Posts: 185
Joined: Thu Nov 17, 2005 12:48 am
Location: Santiago, Chile

Re: correlativo documento con ado y mysql

Postby Daniel Garcia-Gil » Wed Nov 12, 2014 8:17 pm

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"
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: correlativo documento con ado y mysql

Postby russimicro » Wed Nov 12, 2014 10:02 pm

// 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;
}

//******************************************************************
russimicro
 
Posts: 225
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: correlativo documento con ado y mysql

Postby lafug » Thu Nov 13, 2014 3:50 pm

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
lafug
 
Posts: 185
Joined: Thu Nov 17, 2005 12:48 am
Location: Santiago, Chile

Re: correlativo documento con ado y mysql

Postby joseluisysturiz » Thu Nov 13, 2014 9:27 pm

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
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: correlativo documento con ado y mysql

Postby Daniel Garcia-Gil » Fri Nov 14, 2014 2:24 pm

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)
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 63 guests