2014-02-25 30 views
1

我一直在這個問題掙扎了一整天,嘗試了所有可能的方法,我know.here的問題:SQL查詢(用倒序和限制)不工作的Python(OpenERP的)

現場,我「M工作有這樣的格式:

XXX年的例子:001-2014(字符串)

假設我們有這些記錄:

  • 001-2014
  • 011-2014
  • 013-2013

,我期望得到的結果是011-2014(換句話說,與最大的價值最早的一年)

心中已經寫了這個查詢工作正常在PostgreSQL上:

select split_part(numero_bl, '-', 1) as part1, 
     split_part(numero_bl, '-', 2) as part2 
     from livraisons 
ORDER BY part2 desc,part1 desc limit 1 

的split_part功能拆分列 'numero_bl' 2 parts.so結果是類似的東西:

part1 | part2

001 | 2014

當我嘗試將其引入Python代碼裏面返回使用升序回報(「無」)正確的價值觀,當談到降序

這裏是我的函數的簡單版本在python:

def set_numero_bl(self, cr, uid, ids,name,arg,context=None): 
     res={} 
     cr.execute("""select split_part(numero_bl, '-', 1) as part1, 
        split_part(numero_bl, '-', 2) as part2 
        from livraisons 
        ORDER BY part2 desc,part1 desc limit 1""") 
     execution = cr.fetchone() 
     part1 = execution[0] 
     part2 = execution[1] 
     if part1: 
       if part2: 
       annee = int(part2) 
       nombre = int(part1)+1 
       valeur_final= str('%0*d' % (3, nombre))+"-"+str(annee) 
       for livraisons in self.browse(cr, uid, ids): 
        res[livraisons.id]= valeur_final 
     else: 
      valeur_final= str('%0*d' % (3, 1))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y') 
      for livraisons in self.browse(cr, uid, ids): 
       res[livraisons.id]= valeur_final 
     return res 
當然

的時候我不會把「其他條款」將返回(「無」)

請反正是有網絡連接x它還是以任何其他方式解決它?

謝謝

+1

首先,一般來說,您應該避免像這樣建模數據。這應該是兩個領域。 –

+0

謝謝您的回覆。我知道如果它們是兩個獨立的字段,操作它會更容易,但由於受到一些限制,我有時不得不將它存儲在一個字段中。 – soukainas

回答

0

我找到了解決問題的方法。 我改變了我的查詢到該

cr.execute("""select max(numero_bl) as part from livraisons 
      where split_part(numero_bl, '-', 2) >= %s""", 
     ((datetime.datetime.strftime(datetime.datetime.now(), '%Y')),)) 

首先,我只保留記錄中,其中年部分比本年度更大,在這之後我把我場「numero_bl」

的最大值

下面是完整的代碼,如果有人有興趣:

def set_numero_bl(self, cr, uid, ids,name,arg,context=None): 
    res={} 
    cr.execute("""select max(numero_bl) as part 
       from livraisons 
     where split_part(numero_bl, '-', 2) >= %s""", 
     ((datetime.datetime.strftime(datetime.datetime.now(), '%Y')),)) 
    valeur = cr.fetchone()[0] 
    if valeur: 
     value = valeur.split('-'); 
     nombre = int(value[0])+1 
     valeur_final= str('%0*d' % (3, nombre))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y') 
     for livraisons in self.browse(cr, uid, ids): 
      res[livraisons.id]= valeur_final 
    else: 
     valeur_final= str('%0*d' % (3, 1))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y') 
     for livraisons in self.browse(cr, uid, ids): 
      res[livraisons.id]= valeur_final 
    return res 

謝謝大家的回覆

0

該列中有空值。當你問一個降序空值將是第一位的:

select * 
from (values (1), (null)) s(a) 
order by a desc; 
a 
--- 

1 
(2 rows) 

如果你想保持空,然後告訴它訂購空最後

select * 
from (values (1), (null)) s(a) 
order by a desc nulls last; 
a 
--- 
1 

(2 rows) 

或者只是過濾掉空

select * 
from (values (1), (null)) s(a) 
where a is not null 
order by a desc; 
a 
--- 
1 
(1 row) 
+0

我也這麼認爲,但沒有空值,所有記錄全部填充 – soukainas

+0

@soukainas'select count(*)來自livraisons的結果where numero_bl爲null;'? –

+0

結果爲0 – soukainas