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!!
correlativo documento con ado y mysql
correlativo documento con ado y mysql
Luis Alfonso Fuentes Guerrero
FWH 11.06 xHarbour 1.2.1 BCC55 WorkShop
FWH 11.06 xHarbour 1.2.1 BCC55 WorkShop
- 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
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"
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
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: correlativo documento con ado y mysql
// 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;
}
//******************************************************************
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;
}
//******************************************************************
Re: correlativo documento con ado y mysql
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
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
FWH 11.06 xHarbour 1.2.1 BCC55 WorkShop
- joseluisysturiz
- Posts: 2024
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Re: correlativo documento con ado y mysql
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...
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- 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
solo puede haber un campo auto incrementable en las tablaslafug 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
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
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9