Python - Consulta de base de datos por medio de python

   
Vista:

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 07/06/2013 19:14:20
Hola, estoy trabajando en obtener informacion de una base de datos y los datos que se necesitan es el RFC y los precios de compra base (osea sin impuesto) y dependiendo del tipo de IVA que se aplique (que es parte del "where account_id = 3337/3336/3338" las cosnultas asi manejo todo igual y solo me muevo entre el tipo de impuestos con el account_id de la tabla account_invoice_tax.

Para utilizarlo con python el codigo que tengo hasta el momento es este.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import psycopg2
import sys
 
con = None
 
try:
 
    con = psycopg2.connect(database='DB', user='ME', password='1234')
 
    cur = con.cursor()
    cur.execute(" select Account_Invoice.amount_untaxed, right (Res_Partner.vat,length(Res_Partner.vat)-2) as RFC from Account_Invoice inner join Res_Partner on Account_Invoice.partner_id = Res_Partner.id inner join Account_Invoice_Tax on Account_Invoice.id = Account_Invoice_Tax.invoice_id where account_invoice.journal_id=2 and account_invoice.date_invoice >= '2013-01-01' and account_invoice.date_invoice <= '2013-02-01' and account_invoice.reconciled is TRUE and account_invoice_tax.account_id = 3237 and account_invoice.amount_tax >= 0;")
 
    rows = cur.fetchall()
 
    for row in rows:
        print row
 
 
except psycopg2.DatabaseError, e:
    print 'Error %s' % e
    sys.exit(1)
 
 
finally:
 
    if con:
        con.close()


Como ya mencione este codigo se comunica con la base de datos me regresa tanto el RFC y como el monto base de compra, correcto, ahora lo que quiero hacer con esos datos es lo siguiente.

digamos que el fetchall obtuvo solo una linea con los siguientes datos.

LOEL910624ND5 como RFC y el monto base de 227

entonces lo siguiente que deberia de hacer el programa es ponerlo en el siguiente formato.


04|85|LOEL910624ND5|||||227|||||||||||||||

son 22 columnas obligatorias, en la primera siempre va a ir el 04 mientras que en la segunda siempre va a ir el 85. el RFC siempre va en la tercera columna y el monto base se acomoda en la columna 8 si es IVA del 16%., en la columna 11 si es del 11% y en la columna 19 si el IVA es 0%.

y una ves tengo esta tupla digamos, la guardaria como un archivo txt.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Consulta de base de datos por medio de python

Publicado por xve (1235 intervenciones) el 09/06/2013 17:25:04
Hola Marco, me cuesta un poco entender el traspaso del row al formato que indicas, pero no me queda claro donde tienes el problema, si al generar la cadena con el formato que indicas, o al guardarlos en la base de datos...

Lo que no veo, es que la consulta te devuelva el tipo de IVA para ponerlo en la columna 8 u 11.

Si nos puedes comentar...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 10/06/2013 18:24:05
Muy bien y disculpa por no aclarar, pero bueno para los porcentajes de IVA olvide especificar que lo divide en 3 cosnultas y ene ste caso el iva de 16% viene de la parte del WHERE en la cosnulta ( account_invoice_tax.account_id = 3237) y para las de 11% y 0% solo le cambiaria el account_id.


En el ejemplo que puse la bsuqueda solo va a encontrar los montos base de compras con IVA de 16% y los RFCs de esas compras.
Cuanod necesite las de 11% y 0% solo cambiare el account_id en la tabla account_invoice_tax para obtenerlos respectivamente.



y con lo que respecta al formato bueno, tenemos 22 columnas en total, las primeras 2 columnas siempre tendran 04 y 85 respectivamente, mientras que en la tarcera columna se introduce el RFC que sacamos de la base de datos mientras que en este caso el monto base se guarda en la columna 8 debido a que esta consulta tiene en su account_id el numero 3237 el cual pertenece a las compras con IVA de 16%. todas las otras columnas estaran vacias.

Por ultimo, cuando tenga el formato con las 22 columnas y los 4 datos necesarios. Esto quiero guardarlo en un archivo .txt, no lo quiero guardar en la base de datos debido a que esta solo es necesaria para obtener los RFCs y montos bases.

gracias por especificar las dudas :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta de base de datos por medio de python

Publicado por xve (1235 intervenciones) el 10/06/2013 22:58:28
Hola Marco, gracias por comentarnos, pero no me queda muy claro, ya que la solución la veo muy simple... seria algo así dentro de un for:
1
2
3
4
5
6
7
8
9
# creamos el archivo destino
f=file("newfile.txt","w")
 
# recorremos todos los registros de la base de datos
for row in rows:
    # row podria ser algo como: "LOEL910624ND5"
    f.write("04|85|%s|||||227|||||||||||||||\n" % row)
 
f.close()

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 11/06/2013 05:02:01
peor esta sponiendo "LOEL910624ND5" como una cadena establecida estatica y no un valor que puede sacar de la columna VAT de la base de datos que no? consecuentemente el 227 tambien es un valor que saca d ela base de datos de la columna amount_untaxed.

Y si me dicen que es muy facil pero yo me meti a trabajar con eso del python desde 0 y soy un compelto neofito en programacion :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta de base de datos por medio de python

Publicado por xve (1235 intervenciones) el 11/06/2013 08:36:45
Hola Marco, todo es a base de practica, no te preocupes, los inicios como todo son un poco difíciles, pero python es un muy buen lenguaje.

El problema es que no se muy bien que valores recibe de la base de datos, ni como tienen que ir... si nos muestra un ejemplo del tipo de datos que se reciben, y como se tienes que poner, te preparo un ejemplo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 11/06/2013 17:52:13
Ahh okei te explico de nuevo mira


con el siguiente codigo se conecta gracias al psycopg2

con = psycopg2.connect(database='DB', user='ME', password='1234')
y bajo esta linea de codigo viene el execute el cual se avienta toda la logica de mi query.

en my query los unicos 2 selects son los siguientes.

select Account_Invoice.amount_untaxed --- osease que de la tabla acount_invoice jalamos la columna amount untaxed, dicha columna nos regresa en este ejemplo el numero 227.

el segundo select es el siguiente

right (Res_Partner.vat,length(Res_Partner.vat)-2) as RFC

lo esribi asi por que todos lso RFCs en la base de datos comienzan con las letras MX, y necesito ignorar MX y solo jalar el RFC real, la columna se llama vat en la tabla res_partner por lo que le pongo un alias que lo nombre RFC, esta columna pues nos da el RFC y en este ejemplo es MXLOEL910624ND5 peor ignora los primeros 2 caracteres regresandonos LOEL910624ND5

---ME CONTARON que lo regresa como una lista de tuplas pero eso no se porque lo hace, ahi si desconozco---

de hehco esto es lo que regresa en el servidor que lo esoty activando para mostrar un ejemplo real.

http://www.freeimagehosting.net/z7c2w

bueno tras recibir esos datos lo que quieor hacer es escirbirlso en este formato.


Cuenta de columnas = 22

04 = columna 1
85 = columna 2
RFC = columna 3
amount_untaxed = columna 8

las otras 18 colmnas quedaran vacias y peor necesitan existir, el formato correcto de este ejemplo seria el siguiente:

04|85|LOEL910624ND5|||||227|||||||||||||||

Espero este mejor explicado de esta manera :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta de base de datos por medio de python

Publicado por xve (1235 intervenciones) el 11/06/2013 18:55:43
Hola Marco, he intentado simular el resultado de tu consulta... haber si asi te sirve:

1
2
3
4
5
6
7
8
9
10
11
12
13
resultSQL=[
    (247.00, 'BBA830831LJ2'),
    (1188.00, 'PBI0801187CA'),
]
 
# creamos el archivo destino
f=file("newfile.txt","w")
 
# recorremos todos los registros de la base de datos
for row in resultSQL:
    f.write("04|85|%s|||||%s|||||||||||||||\n" % (row[1],row[0]))
 
f.close()

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 11/06/2013 22:37:42
Mas o menos entiendo la logica de como se recorre los registros d ela base de datos con el "for row in resultSQL:

entocnes imprimimos el templete y en las columnas 3 y 8 se pone %s por que son lso placeholders para lo que vaya a sacar de row 1 y row 0.

mi duda es la aprte anterior:

caundo se declara que resultSQL = los primeros 2 renglones de registros que obtiene la base de datos, pero esos no lso podemos conocer de antemano antes de que corra el programa no?
o tal ves lo esoty viendo de manera incorrecta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta de base de datos por medio de python

Publicado por xve (1235 intervenciones) el 12/06/2013 07:44:26
Hola Marco, no entiendo muy bien tu pregunta cuando dices los "dos renglones"... el contenido de resultSQL te vendrá dado por la consulta que realices a la base de datos, no?
El contenido no sabes cual es, pero si sabes que son dos campos por registro, no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 12/06/2013 09:13:04
resultSQL=[
(247.00, 'BBA830831LJ2'),
(1188.00, 'PBI0801187CA'),
]

CREO que ya entendi, una ves que fue hecha la busqueda en la BD...DEPUES se pone que resultSQL = [(lo que se encontro en el query)
]

asi si estoy en lo cierto? :P

y entocnes eso simplemente lo puedo pegar debajo dle codigp que hace conexion y query con la base de datos y todo bien?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta de base de datos por medio de python

Publicado por xve (1235 intervenciones) el 12/06/2013 10:19:35
Hola Marco, si exacto, es eso exactamente... yo al no disponer de la base de datos, he simulado el resultado con lo que tu me mostraste en la imagen.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 12/06/2013 21:07:52
Perfecto, me confundi un poco por que en mi caso resultSQL se llamaba "rows" peor ya aplique el codigo proporcionado y en efecto el resultado fue el esperado.


se creo un archivo llamado newfile en el que se encontraan todos los registros impresos en el formato deseado, y ahora el maestro nos revelo que tenemos que eliminar los decimales usando la siguiente logica.

10.40 = 10
10.50 = 11


Ahora un problemota es que mi manera de afrontar el problema parece no ser la mas correcta, en mi caso queria crear el porgrama que hiciera las consultas por separado, en este caso en la parte del query tengo una restriccion que es "account_id" en la tabla "account_invoice_tax" ese id es el que lo identifica como IVA de 16%, y lo que queria era solo cambiar el codigo ligeramente para acomodar los IVAS de 11% cmabaindo el account_id a 3236 y en la parte del templete solo cambiaria

f.write("04|85|%s|||||%s|||||||||||||||\n" % (row[1],row[0]))

y lo pondria asi

f.write("04|85|%s||||||||%s||||||||||||\n" % (row[1],row[0]))

debido a que los montos con 11% de IVA se ubican en la columna 11, y los de 0% de IVA se ubican en la columna 19.

Ahora parece que no va a ser posible mi idea original debido a que el maestro nos puso una ingeniosa trampa.

Existen compras en ciertos RFCs con IVAs tanto de 16% como de 11%, esto por que en la practica en el mundo real las companias con varias sucursales pueden llegar a comprar a una misma compania en diferentes estados y en estos estados el IVA se maneja diferente y por lo tanto tienen mas de una columna.

Asi que al parecer ahora no solo debo de hacer las 3 consultas en el mismo programa, ahora tengo que redondear los montos base al entero mas cercano y si un RFC tiene tanto montos base referentes a 16% de IVA y a 11% y a 0% entocnes se llenan todas las columnas que apliquen.


el nuevo templete seria

04|85|RFC|||||monto16%|||monto 11%||||||||monto 0%|||| --si no existe el monto de ese porcentaje entocnes se queda vacia la columna.

Para referencia en la base de datos el acount_id maneja los porcentajes de la siguiente manera

16%=3237
11%=3238
0%=3236

supongo que tengo que hacer una especie de ciclo donde cheque los montos de todos los porcentajes, referenciarlos con RFC y poner los montos en sus columans respectivas si aplican, una ves que todo esto se haya llevado a cabo se aplicaria el codgio final que es:

f=file("newfile.txt","w")

for row in rows: f.write("04|85|%s|||||%s|||||||||||||||\n" % (row[1],row[0]))
f.close()

en mi caso por que resultSQL se llama rows.

Se siente como haberle cortado la cabeza al dragon y de ahi salieorn 2 cabezas mas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 13/06/2013 21:21:54
Le di unos buenos golpes al problema y resolvi la parte del redondeo, al principio queria usar math.ceil en python para hacerl el redondeo una ves que recibiera el amount_untaxed de la base de datos pero python me dijo que necesitaba flotantes para hacerlo, entocnes recorde que el tipo de dato que se gaurda en amount_untaxed es numerico lo cual probablemente estaba ocasionando el problema.

Bueno investigue un poco y encontre las funciones en queries y pues round (tabla.columna) era lo que necesitaba.

En efecto el archivo ahora nos muestra el formato correcto y con el monto base sin numeros decimales.


Ahora con el nuevo problema referente al templete.

intente correrlo asi solo para ver que sucedia

for row in rows: f.write("04|85|%s|||||%s|||%s||||||||%s||||\n" % (row[1],row[0]))


en efecto, me marco error de falta de argumentos ya que de momento solo se sacan 2 registros d ela BD, aunque de todos modos necesito la posibilidad de poder poner 4 registros (1 RFC afuerzas, y los montos que apliquen las columnas de IVA que apliquen)

Y bueno ya me volvi a atorar :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta de base de datos por medio de python

Publicado por xve (1235 intervenciones) el 14/06/2013 07:30:55
Hola Marco, gracias por comentarnos...

El error que te da, es porque tienes 4 veces el %s, pero solo le envías dos valores (row[1],row[0]).. si pones 4 veces el %s tendrás que enviar 4 valores.
Algo así:
f.write("04|85|%s|||||%s|||%s||||||||%s||||\n" % (row[1],row[0],row[2],row[3]))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta de base de datos por medio de python

Publicado por Marco Antonio (9 intervenciones) el 14/06/2013 18:20:12
si es lo que suponia, entocnes ese metodo para proporcionar formato a los datos tendria que ser cambiado creo...o bueno aun sigo investigando de que manera los registros de la base de datos que saque puedo tenerlos "guardados" y entocnes hacer una consulta de %IVA diferente para checar si existen RFCs que coincidan con los de 16% y marcarle ambas columnas respectivamente tras haber hecho ese chequeo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar