PDA

Ver la Versión Completa : funciones php para firebird


novato_erick
07-03-2012, 22:10:13
Hola a todos:

he visto que firebird puede manejar un update o un insert este es el link que algunos programadores que sugieren lo detallan; http://jhonny.clubdelphi.com/2010/08/12/sentencia-%E2%80%9Cupdate-or-insert%E2%80%9D-desde-firebird-2-1-recuperado/


Este es mi codigo php


//Actualiza o Ingresa de datos en tabla CONTEO_INV
$dbh =conectarINV();
$stmt="UPDATE OR INSERT INTO CONTEO_INV (
FK_CODARTICULO,INV_BODEGA,INV_PVENTA, INV_AGREGADO,FK_CODUSUARIO
)
VALUES (
'".$v_carticulo."',
".$v_cantidad.",
".$v_cantidadpv.",
".$v_cantidadag.",
'".$v_user."'
)
MATCHING (FK_CODARTICULO);";
$q=ibase_query($stmt);
$q=ibase_prepare($stmt);
ibase_free_query($q);



al final me manda errores como este: Warning: ibase_query() [function.ibase-query]: Dynamic SQL Error SQL error code = -104 Token unknown - line 8, char 7 , in C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\pventas\gestionbodegapda\ls_inventario_ajusta_bodega_db.php on line 168

Warning: ibase_prepare() [function.ibase-prepare]: Dynamic SQL Error SQL error code = -104 Token unknown - line 8, char 7 , in C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\pventas\gestionbodegapda\ls_inventario_ajusta_bodega_db.php on line 169

Warning: ibase_free_query(): supplied argument is not a valid Firebird/InterBase query resource in C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\pventas\gestionbodegapda\ls_inventario_ajusta_bodega_db.php on line 170

alguien podría ayudarme con esto?

Saludos


novato_erick

Casimiro Notevi
08-03-2012, 00:56:17
Pues revisa ese código, los puntos, las comillas principalmente, etc.
Aquí (http://www.intitec.com/varios/paper-fb-phplnx.pdf) tienes un documento para manejo de firebird con php

novato_erick
08-03-2012, 02:04:14
Hola Casimiro

Gracias por contestar en este codigo:



////Actualizar o Insertar tabla de CONTEO_INV
$dbh =conectarINV();
$stmt=("UPDATE OR INSERT INTO CONTEO_INV (
FK_CODARTICULO,
INV_BODEGA,
INV_PVENTA,
INV_AGREGADO,
FK_CODUSUARIO
)
VALUES (
'".$v_carticulo."',
".$v_cantidadbdg.",
".$v_cantidadpv.",
".$v_cantidadag.",
'$v_user',
)
MATCHING (
FK_CODARTICULO
)");
$q=ibase_query($stmt);
$q=ibase_prepare($stmt);
ibase_free_query($q);



Nada....

Bueno en la utilización del Insert no tengo problemas y en update el problema es usar ese metodo que sugieren... lo que necesito es solamente comprobar si el codigo existe que se actualice y si no simplemente se inserte en php.

Saludos

novato_erick

georkis
08-03-2012, 14:07:48
No tengo experiencia sobre Firebird, pero te diré que la variable que almacena el lenguaje SQL hay dos acciones posibles a realizar update e insert... el error que te esta dando es sobre la sintasis de SQL... define bien la instrucción de SQL y clasificala por separado update y insert... maneja las variables por condiciones si es update ejecuta SQL update, sino Insert...

novato_erick
08-03-2012, 14:37:06
Hola Gracias por responder

Este es mi condicion:


//Lectura de Parametros
// CODIGO ARTICULO
if (isset ($_POST['p_carticulo']))
///Prepara parametro de consulta para recuperar datos del articulo conforme al codigo
$v_carticulo= $_POST['p_carticulo'];
$v_varconsulta=$v_carticulo;
/////Prepara variable de consulta
$v_wheret="c.FK_CODARTICULO='".$v_varconsulta."'";
if ($v_varconsulta<>'') { {$v_valida='S';
}
//Si hay valor carga
if ($v_varconsulta<>'') {
$v_consulta=$v_consulta.$v_varconsulta.'.';
$v_valida='S';
if ($v_where<>'') { $v_where=$v_where." AND ".$v_wheret; }
else { $v_where=$v_wheret; }
}
}



Me equivoco en algo?


<?PHP
echo '<TABLE border="0" width= "100%" ALIGN=CENTER bgcolor="#dddddd" cellspacing="0" cellpadding="0">';
$v_user=$_SESSION['usuario'];
//////////////CONSULTA PARA CODIGO ARTICULO/////////////////////////////////////////////
echo '<tr><td class="titulotabla">Transaccion para : '.$v_carticulo;
echo '</td></tr>';
/////Se activa si se valida que entraron datos por el usuario.
if ($v_valida=='S')
{
/////Carga consulta para conocer su existencia
$stmt=select_qconteo_inv($v_where);
///Actualizacion de datos en tabla CONTEO_INV
$dbh =conectarINV();
$stmt="UPDATE CONTEO_INV SET INV_BODEGA = ".$v_cantidadbdg.",
FK_CODUSUARIO = '$v_user' WHERE FK_CODARTICULO = '".$v_carticulo."'";
$q=ibase_query($stmt);
$q=ibase_prepare($stmt);
ibase_free_query($q);
}
//<?PHP
else
{
//SI EL DATO NO SE ENCUENTRA
///Ingreso de datos en tabla CONTEO_INV
$dbh =conectarINV();
$stmt="INSERT INTO CONTEO_INV (
FK_CODARTICULO,INV_AGREGADO,FK_CODUSUARIO
)
VALUES (
'".$v_carticulo."',
".$v_cantidad.",
'$v_user'
)";
$q=ibase_query($stmt);
$q=ibase_prepare($stmt);
ibase_free_query($q);
}

georkis
08-03-2012, 15:18:14
Bueno ahora esta más claro el código... a ver si entiendo... tienes dos estructura de SQL update y Insert... me dices que el ejemplo anterior te insertaba pero no actualizaba... bueno el problema puede ser el pase de la variable que debe de recibir el SQL update con el criterio del campo clave para actualizar... he visto que usas el metodo POST... Primer paso que debes hacer y no has hecho aun, eso pienso claro!!... es declarar el recibimiento de las variables $_POST['nombre del campo input']... dime si estoy en lo correcto...

novato_erick
08-03-2012, 15:45:19
Hola gracias por tu atención:

Te refieres a esto verdad:


//Lecturas de parametros
if (isset ($_POST['p_carticulo']))
{
$v_carticulo=$_POST['p_carticulo']; //captura el codigo del articulo
}
if (isset ($_POST['p_cantidad']))
{
$v_cantidadbdg=$_POST['p_cantidad'];// captura cantidad en bodega
}
if (isset($_POST['p_cantidadpv']))
{
$v_cantidadpv=$_POST['p_cantidadpv'];// captura cantidad en punto de venta
}
if (isset($_POST['p_cantidadag']));
{
$v_cantidadag=$_POST['p_cantidadag'];//Captura cantidad en otros puntos
}


a tambien tengo esta funcion

//////////Construye sentencia para listar consulta del condigo de la tabla CONTEO_INV
function select_qconteo_inv($v_condicion)
{
$v_consulta="select c.FK_CODARTICULO from CONTEO_INV c";
$v_order=" order by c.FK_CODARTICULO";
if ($v_condicion<>'') {
$v_consulta=$v_consulta." where ". $v_condicion;
}
$v_consulta=$v_consulta.$v_order;
return $v_consulta;
}



Lo extraño es que si no encuentra la consulta FK_CODARTICULO se salta el else (la insersion). aunque mi validación me de un N

Saludos


novato_erick

novato_erick
08-03-2012, 16:08:50
En resumen este es el codigo completo



<?php
/////////////////////////////////////////////////////////////////////////
/////Erick Castillo ////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//inicia sesion
session_start();
$v_id1=session_id();
$v_id2='0';
if (isset ($_POST['p_id']))
{
$v_id2 = $_POST['p_id'];
}
//define inclusiones
//Incluye cabeza y pie template de las paginas
include ("ls_cuerpo_php.php");
//funciones
include("ls_funciones_php.php");
//conexiones DB
include("ls_config.php");
//funciones de control sobre validacion del usuario
include ("ls_valida_acceso_php.php");
//llama usuario
$v_user=$_SESSION['usuario'];
//Proteccion de pagina
validaentrada($v_id2,$v_id1);
///Inicializacion de Variables
$v_carticulo='';
$v_cantidad=0;
$v_cantidadbdg=0;
$v_cantidadpv=0;
$v_cantidadag=0;
$v_accion ='CONTEO';
$v_valida='N';
$v_consulta='';
$v_where = '';
$v_wheret = '';
$v_varconsulta='';
$v_tcolumnas=5;
//Lectura de Parametros
// CODIGO ARTICULO
if (isset ($_POST['p_carticulo']))
///Prepara parametro de consulta para recuperar datos del articulo conforme al codigo
$v_carticulo= $_POST['p_carticulo'];
$v_varconsulta=$v_carticulo;
/////Prepara variable de consulta
$v_wheret="c.FK_CODARTICULO='".$v_varconsulta."'";
if ($v_varconsulta<>'') { {$v_valida='S';
}
//Si hay valor carga
if ($v_varconsulta<>'') {
$v_consulta=$v_consulta.$v_varconsulta.'.';
$v_valida='S';
if ($v_where<>'') { $v_where=$v_where." AND ".$v_wheret; }
else { $v_where=$v_wheret; }
}
}
//Lecturas de parametros
if (isset ($_POST['p_carticulo']))
{
$v_carticulo=$_POST['p_carticulo'];
}
if (isset ($_POST['p_cantidad']))
{
$v_cantidadbdg=$_POST['p_cantidad'];
}
if (isset($_POST['p_cantidadpv']))
{
$v_cantidadpv=$_POST['p_cantidadpv'];
}
if (isset($_POST['p_cantidadag']));
{
$v_cantidadag=$_POST['p_cantidadag'];
}
?>
<?PHP
//////////INICIA CODIGO
cabeza('Inventario_ajusta_DB');
//Codigos js
//jsformpos('codi','p_carticulo');
//Formato cuerpo
cuerpotag('');
//Contenedor
marco('Usuario Movil');
//contenedor de usuario
marcouser($v_user)
/////////////////////////////////////////////////////////////////////////
/////Erick Castillo ////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
?>
<?PHP
echo '<TABLE border="0" width= "100%" ALIGN=CENTER bgcolor="#dddddd" cellspacing="0" cellpadding="0">';
$v_user=$_SESSION['usuario'];
//////////////CONSULTA PARA CODIGO ARTICULO/////////////////////////////////////////////
echo '<tr><td class="titulotabla">Transaccion para : '.$v_carticulo;
echo '</td></tr>';
/////Se activa si se valida que entraron datos por el usuario.
if ($v_valida=='S')
{
/////Carga consulta para conocer su existencia
$stmt=select_qconteo_inv($v_where);
///Actualizacion de datos en tabla CONTEO_INV
$dbh =conectarINV();
$stmt="UPDATE CONTEO_INV SET INV_BODEGA = ".$v_cantidadbdg.",
FK_CODUSUARIO = '$v_user' WHERE FK_CODARTICULO = '".$v_carticulo."'";
$q=ibase_query($stmt);
$q=ibase_prepare($stmt);
ibase_free_query($q);
}
//<?PHP
else
{
//SI EL DATO NO SE ENCUENTRA
///Ingreso de datos en tabla CONTEO_INV
// $stmt=select_qconteo_inv($v_where);
$dbh =conectarINV();
$stmt="INSERT INTO CONTEO_INV (
FK_CODARTICULO,INV_BODEGA,FK_CODUSUARIO
)
VALUES (
'".$v_carticulo."',
".$v_cantidadbdg.",
'$v_user'
)";
$q=ibase_query($stmt);
$q=ibase_prepare($stmt);
ibase_free_query($q);
}
//Actualiza o Ingresa de datos en tabla CONTEO_INV
////////////////////////////////////
// $dbh =conectarINV();
// $stmt="UPDATE OR INSERT INTO CONTEO_INV(FK_CODARTICULO,INV_BODEGA,INV_PVENTA,INV_AGREGADO,FK_CODUSUARIO)
// VALUES ('".$v_carticulo."',".$v_cantidadbdg.",".$v_cantidadpv.",".$v_cantidadag.",'$v_user')
// MATCHING (FK_CODARTICULO)";
// $q=ibase_query($stmt);
// $q=ibase_prepare($stmt);
// ibase_free_query($q);
echo '<TR><td class=alerta>';
//echo 'REGISTRO DE '.$v_accion.' HA SIDO ACTUALIZADO';
echo 'REGISTRO DE CONTEO HA SIDO ALMACENADO';
echo '</td></TR>';
echo '<tr><td class=alerta>';
//boton_sigueinventario($v_id1);
echo '<FORM METHOD="POST" ACTION="ls_busca_db_cantidad_bodega.php">';
echo '<input name="p_id" type="hidden" VALUE="'.$v_id1.'" size="14">';
echo '<input class="alerta" type="submit" value="CONTINUAR">';
echo '</form>';
echo '</td></tr>';
trazalinea('alerta',$v_tcolumnas,4);
echo '</table>';
?>
<?PHP
pie($v_id1,'1');
?>



Espero encontrar solución no se porque estoy bloqueado.


Saludos

novato_erick

roman
08-03-2012, 16:20:00
No tengo experiencia sobre Firebird, pero te diré que la variable que almacena el lenguaje SQL hay dos acciones posibles a realizar update e insert... el error que te esta dando es sobre la sintasis de SQL... define bien la instrucción de SQL y clasificala por separado update y insert... maneja las variables por condiciones si es update ejecuta SQL update, sino Insert...

Posiblemente este no es el problema. Precisamente, en su mensaje inicial, novato_erick hace referencia a un enlace donde se explica la introducción de la sentencia conjunta update or insert en Firebird 2.1. Es decir, no es que se haya confundido y puesto el insert y el update en la misma consulta, sino que se trata de una particularidad especial de Firebird.

Erick,

El mensaje original de error indica un término desconocido en la línea 8, caracter 7. Para saber exactamente qué puede dar ese error necesitaríamos ver como queda la consulta una vez sustituídos los valores de las variables.

Prueba poniendo esto justa antes del ibase_query:


echo '<pre>';
echo $stmt;
echo '</pre>';
die;


y pon aquí el texto que obtengas.

// Saludos

novato_erick
08-03-2012, 16:26:57
Este es el mensaje que me envia Roman tambien gracias por tu atención:


UPDATE OR INSERT INTO CONTEO_INV(FK_CODARTICULO,INV_BODEGA,INV_PVENTA,INV_AGREGADO,FK_CODUSUARIO) VALUES ('0324001069003',8,0,,'ERICK') MATCHING (FK_CODARTICULO)

Saludos

novato_erick

roman
08-03-2012, 16:32:03
Bueno, pues ahí está el error:


UPDATE OR INSERT INTO CONTEO_INV(FK_CODARTICULO,INV_BODEGA,INV_PVENTA,INV_AGREGADO,FK_CODUSUARIO) VALUES ('0324001069003',8,0,,'ERICK') MATCHING (FK_CODARTICULO)


justo después del cero y antes de Erik; falta un valor. Revisa la variable $v_cantidadag que aparentemente está vacía.

Por cierto, soy roman, no casimiro.

// Saludos

Casimiro Notevi
08-03-2012, 16:47:27
Por cierto, soy roman, no casimiro.
Que quede claro, porque uno es guapo y el otro es feo, no vayamos a confundirnos :D

novato_erick
08-03-2012, 16:54:22
Disculpa me di cuenta del error de nick pero fue tarde para corregirlo.

de todas manera puse un 0 en donde no me capturaba el dato de la variable para ver si lo enviaba a la tabla pero nada...

Saludos

novato_erick

novato_erick
08-03-2012, 17:35:24
Roman por estar concentrado en la sentencia sql no me habia percatado que antes de iniciar una sentencia tenia unas clausulas que siempre me solicitaban actualización, es por eso que jamas me iva a insertar a parte de la variable que me hacia falta declarar con el POST.

Caballeros agradezco mucho su ayuda. ahora aqui sigo el camino, Gracias por todo chicos nuevamente.

Saludos

novato_erick