2017-08-13 9 views
0

'factura'という名前のMySQLテーブル(英語の請求書)に複数のレコードを挿入しようとしています。 'INSERT ... SELECT 'Pythonで。ここで設定するINSERT ... SELECT課金システムのPythonとMySQLでのFORブール

#QUERY OF THE CONSULTA DEL VADOR DEL IVA JURIDICO 
cursor.execute("SELECT ivajuridico FROM configuracion;") 
dato1 = cursor.fetchall() 
#CONSULTA DE LA INFORMACION DE LOS ARRENDATARIOS 
cursor.execute("SELECT c_cod, now(), relacionip.i_cod, i_vlrenta, a_tpersona FROM contratos INNER JOIN relacionip ON contratos.r_id = relacionip.r_id INNER JOIN inmuebles ON relacionip.i_cod = inmuebles.i_cod INNER JOIN arrendatarios ON contratos.a_cc = arrendatarios.a_cc;") 
dato2 = cursor.fetchall() 
connect.commit() 
for a in dato1: 
    ivaj = a[0] #16.0 (float) 
    print ivaj 
    for i in dato2: 
     if i[4] == 2: 
      #showinfo("","Es Jurídico") 
      iva = i[3]*ivaj/100 #vl arriendo*iva/100 
      total = i[3]+iva 
     else: 
      #showinfo("","Es Natural") 
      iva = 0 
      total = i[3]+iva 
    try: 
     cursor.execute('''INSERT INTO factura_arre(c_cod, fa_fecha, fa_iva, fa_total) SELECT c_cod, now(), '%f', '%f' FROM contratos INNER JOIN relacionip ON contratos.r_id = relacionip.r_id INNER JOIN inmuebles ON relacionip.i_cod = inmuebles.i_cod INNER JOIN arrendatarios ON contratos.a_cc = arrendatarios.a_cc;''' % (iva, total)) 
     connect.commit() 
    except: 
     pass 
    showinfo('Operación', "Grabado!") 

最初のクエリは、唯一の浮動小数点値(16.0)が含まれて「configuracion」という名前のテーブルに「IVAJurídico」と呼ばれる税、の値を検索し、この1は、これらの法的なテナントに適用されます。

MariaDB> SELECT ivajuridico FROM configuracion; 
+-------------+ 
| ivajuridico | 
+-------------+ 
|   16 | 
+-------------+ 
1 row in set (0.00 sec) 

そして、2番目のクエリは、これらは、データベース内のテナントの合計であるので、結果は、8つのレコードがいくつかの関連テーブルでテナントとプロパティのrequiered情報を検索します。それらのうちの1つは、最初のもので、合法的なタイプです。

MariaDB> SELECT c_cod, now(), relacionip.i_cod, i_vlrenta, a_tpersona FROM contratos INNER JOIN relacionip ON contratos.r_id = relacionip.r_id INNER JOIN inmuebles ON relacionip.i_cod = inmuebles.i_cod INNER JOIN arrendatarios ON contratos.a_cc = arrendatarios.a_cc; 
+-------+---------------------+-------+-----------+------------+ 
| c_cod | now()    | i_cod | i_vlrenta | a_tpersona | 
+-------+---------------------+-------+-----------+------------+ 
| 1509 | 2017-07-03 23:55:08 | 1140 | 5284240 |   2 | 
| 1526 | 2017-07-03 23:55:08 | 170 | 687500 |   1 | 
| 1528 | 2017-07-03 23:55:08 | 88 | 432000 |   1 | 
| 22736 | 2017-07-03 23:55:08 | 386 | 1338000 |   1 | 
| 22754 | 2017-07-03 23:55:08 | 192 | 720000 |   1 | 
| 22789 | 2017-07-03 23:55:08 | 1144 | 645000 |   1 | 
| 22898 | 2017-07-03 23:55:08 | 448 | 3700000 |   1 | 
| 22900 | 2017-07-03 23:55:08 | 449 | 1100000 |   1 | 
+-------+---------------------+-------+-----------+------------+ 
8 rows in set (0.00 sec) 

次のコードは、私が思うに、それはテナントが法的なタイプであれば、法的な人々のための税の値が適用されなければならないことを規定しているため、それは、理解しやすいですが、そうでない場合は0

しかし、残りのコードはtry:でINSERT ... SELECTを実行する必要があります。すべてのテナントと税金0に対して同じ賃貸料の値を持つレコードが8つあります。そのうちの1つは合法ですが無視されます。私はtryを設定し、else以下にその内容なら、私は64 recodrsの代わりに、8

mysql> select * from factura_Arre; 
+--------+-------+---------------------+--------+----------+-----------+----------+ 
| fa_num | c_cod | fa_fecha   | fa_iva | fa_total | fa_estado | fa_notas | 
+--------+-------+---------------------+--------+----------+-----------+----------+ 
|  40 | 1509 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
|  41 | 1526 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
|  42 | 1528 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
|  43 | 22736 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
|  44 | 22754 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
|  45 | 22789 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
|  46 | 22898 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
|  47 | 22900 | 2017-06-08 01:16:01 |  0 | 1100000 |   0 | NULL  | 
+--------+-------+---------------------+--------+----------+-----------+----------+ 
8 rows in set (0.00 sec) 

を得たtry:を配置する必要がありますか、私はそれを動作させるどのような他のコードを必要としないところのものはありますか?

+0

insert文からselect文を実行します。%f列を使用せずに単独で選択します。あなたは8つのレコードを取得します。これらの8つのレコードを最後の値iva、totalで挿入しています。 ivaにprintステートメントを入れ、ifブロック、elseブロック、insertの直前に選択してください。なぜこの動作が起こるのかがわかります – LAS

答えて

0

私はtryブロックをインデントし、insertからselectを削除しました。それは繰り返されるdato2選択を繰り返した。私は挿入のためにdat02からc_codを使用しました。

#QUERY OF THE CONSULTA DEL VADOR DEL IVA JURIDICO 
cursor.execute("SELECT ivajuridico FROM configuracion;") 
dato1 = cursor.fetchall() 
#CONSULTA DE LA INFORMACION DE LOS ARRENDATARIOS 
cursor.execute("SELECT c_cod, now(), relacionip.i_cod, i_vlrenta, a_tpersona  FROM contratos INNER JOIN relacionip ON contratos.r_id = relacionip.r_id INNER JOIN inmuebles ON relacionip.i_cod = inmuebles.i_cod INNER  JOIN arrendatarios ON contratos.a_cc = arrendatarios.a_cc;") 
dato2 = cursor.fetchall() 
connect.commit() 
for a in dato1: 
    ivaj = a[0] #16.0 (float) 
    print ivaj 
    for i in dato2: 
     if i[4] == 2: 
      #showinfo("","Es Jurídico") 
      iva = i[3]*ivaj/100 #vl arriendo*iva/100 
      total = i[3]+iva 
     else: 
      #showinfo("","Es Natural") 
      iva = 0 
      total = i[3]+iva 
     try: 
     cursor.execute("INSERT INTO factura_arre(c_cod, fa_fecha, fa_iva, fa_total) values ('%s', now(), '%f', '%f')" % (i[0], iva, total)) # i[0] is c_cod for the row just calculated. 
     connect.commit() 
     except: 
      pass 
    showinfo('Operación', "Grabado!") 
+0

ああ、そうです!それでおしまい!そして私は思ったよりシンプルだった。ありがとう!!! – Einnerlink

関連する問題