From: | Gunnar Wolf <gwolf(at)gwolf(dot)org> |
---|---|
To: | Gabriel Colina <colina_movil(at)yahoo(dot)com> |
Cc: | Alvaro Herrera <alvherre(at)commandprompt(dot)com>, Gabriel Ferro <gabrielrferro(at)yahoo(dot)com(dot)ar>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Simbolos dentro de cadenas y el codigo propuesto |
Date: | 2007-03-15 00:34:18 |
Message-ID: | 20070315003418.GI11425@gwolf.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Gabriel Colina dijo [Wed, Mar 14, 2007 at 03:03:05PM -0500]:
> Ejemplo 1
> Para mi muy apropiado.
>
> Creo una funcion en el lenguaje PLPGSQL, en
> postgresql, (aclaro que si alguna palabra no la pongo
> bien por ejemplo plpgsql no se escribe asi, me importa
> poco, debatan sobre conceptos por favor).
> Retomando el tema aca hay una funcion a la que
> pasandole parametros desde visual borra una tabla
> auxiliar, la llena de datos le hace algun insert y
> podria ser un update en fin todo.
> Incluso uno de los select de la insercion invoca otra
> funcion.
>
> CREATE OR REPLACE FUNCTION
> "central"."fnc_imp_ficha_articulo" (text, date,
> integer) RETURNS boolean AS
> $body$
> begin
> delete from central.imp_ficha_stock;
> insert into central.imp_ficha_stock
> (id_local,sucursal,
> empresa,id_lin,documento,serie,numero,fecha,
> id_articulo,entradas,salidas,saldos)
> select id_local,sucursal,
> empresa,id_lin,documento,serie,numero,fecha,
> id_articulo,entradas,salidas,saldos from
> central.fnc_ficha_articulo($1,$2,$3);
> return true;
> end;
> $body$
> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT
> SECURITY INVOKER;
>
> Llamada desde visual
>
> DtaSysGeGcFunc.central_fnc_imp_ficha_articulo
> TxtDatos.Text, DTPDESDE.Value,
> Val(DataComboLocal.BoundText)
¿Mi crítica principal a esto? Recuerda que los lenguajes de
programación están hechos como herramienta de comunicación entre
humanos, con suficiente formalismo para ser capaces de ser traducidos
a algo que una computadora pueda entender. Entonces, ¿por qué no
comenzar indentando bonito y poniendo nombres en simple y llano inglés
a las cosas? Sería mucho más fácil ponerle un nombre suficientemente
corto pero descriptivo a DtaSysGeGcFunc. Esperar que con sólo leerlo
el programador que se acerque a tu código le entienda, es mucho
pedir. Esperar que se acuerde de cómo escribirlo en otro momento a
1000 líneas de distancia, creo yo, también.
En segundo lugar: Estás creando una función plpgsql que consta
únicamente de un «delete», un «insert», un «select» y un «return
true». Lo que es más, tan poco te importa el lector humano de tu
código que ni siquiera le das aliases a $1, $2 y $3 para que sepa qué
debe ir en esas variables - pero bueno, pecata minuta. Ni siquiera
estás abriendo/cerrando una transacción para tener control en caso de
un error a medio proceso. En mi opinión (y, claro, las opiniones son
como los ombligos: Cada quién tiene la propia), algo de este nivel de
complejidad no merece una llamada a un segundo lenguaje. Sí, haz tus
tres o mil capas - ¿Pero por qué no hacerlo de una manera más
sencilla? Por ejemplo: (lleno de basura en lugar de tu primer insert,
que está incompleto)
sub imp_ficha_articulo {
my ($self, $text, $value, $boundtext) = @_;
my @data;
$self->{db}->begin_work;
eval {
$self->{db}->do('DELETE FROM central.imp_ficha_stock');
my $sth = $self->{db}->prepare('INSERT INTO central.imp_ficha_stock
(id_local, sucursal, empresa, id_lin, documento, serie,
numero, fecha, id_articulo, entradas, salidas, saldos)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
$sth->execute(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
$sth = $self->{db}->prepare('SELECT id_local, sucursal, empresa,
id_lin, documento, serie, numero, fecha, id_articulo,
entradas, salidas, saldos FROM
central.fnc_ficha_articulo(?, ?, ?)');
$sth->execute($text, $value, $boundtext);
@data = $sth->fetchrow_array;
$self->{db}->commit;
};
if ($@) {
warn "ERROR: $@";
$self->{db}->rollback;
return 0;
}
return 1;
}
Claro, acá puedes ver algunos de los puntitos acerca de cómo se maneja
este proceso en Perl - No me meto a explicar a detalle, creo que no
tiene sentido (además, no entiendo bien qué es lo que hace tu
aplicación, y explicarte tus propias funciones no es muy divertido ;-)
). Pero si esto lo haces estructurando tus clases correctamente, te va
a resultar mucho más sencillo y natural extenderlas y darles
mantenimiento.
Y nótese claramente: Escribí la función directo en el cliente de
correo, sin probar nada. Y hasta tengo que reconocer que estoy un
poquito oxidado en perlazos, hasta tuve que asomarme al manual de DBI
para recordar cómo se manejaba el eval/begin_work/commit/rollback ;-)
Saludos,
--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
From | Date | Subject | |
---|---|---|---|
Next Message | Dimas Ayala | 2007-03-15 00:43:21 | Re: pasar DBF's a Postgresql |
Previous Message | Leonel | 2007-03-15 00:17:35 | Re: pasar DBF's a Postgresql |