Filtrowanie i wyświetlanie danych [Zamknięte]

To pytanie zostało zamknięte z powodu: niezwiązane z tematem lub nieaktualne

przez
Dr.One
na 22.09.2015 13:31:11

Zaktualizowane: 01.06.2015 - pomyślałem, zmienię aby było zgodne bardziej z old API ale chyba coś nie za bardzo, składnia ?

from openerp.osv import models, fields, orm

class stock_location(osv.osv):

    _inherit = 'stock.location'

    _columns = {

        'loca': fields.char('Location'),

        'qty': fields.function(_get_current_stock, type = "float", string = 'Qty', store = {'stock.quants': (_get_locations, ['location_id','qty'], 1 ) } ),

}

def _get_current_stock(self, cr, uid, ids, fields, arg, context=None):

        res = []

        quants = []

        for obj in self.browse(cr, uid, ids, context=context):

            if 'default_product_id' in context:

                quants = self.env['stock.quant'].search([('location_id','=',id),('product_id','=?',context['default_product_id'])])

            else:

                quants = self.env['stock.quant'].search([('location_id','=',id)])

                    for quant in quants:

                        res[obj.id] += quant.qty

                        return res

 

    def _get_locations(self, cr, uid, ids, context=None):

        res = []

        for quant in self.pool.get('stock.quants').browse(cr, uid, ids, context=context):

            if quant.location_id:

                res.append(quant.location_id.id)

                return res
 

    def name_get(self):

        res = []

        for loc in self:

            res.append((loc.id, loc.name + " / " + str(loc.qty) + " Units" or ''))

            return res

Dr.One
Dr.One
341
| 5 3 5
Data pytania 21.05.2015, 21:52
0
głos
907 Odsłony

Wydaje mi się, że musisz przedefiniować całe pole "Source location" i uczynić je polem funkcyjnym, filtrowanie powinno odbyć się chyba po stronie serwera.

Dariusz Żbikowski
na 26.05.2015, 09:01

Jak już Ci sugerowałem, z lokalizacji nie wydobędziesz nazwy magazynu bo brak jest takiego powiązania (chyba, że je jakoś zbudujesz, choć wątpię bo lokalizacje nie muszą się znajdować w żadnym magazynie, to dwa niezależne całkiem od siebie byty)! Nieco starszej dokumentacji od przydatnych metod masz tutaj: https://doc.odoo.com/v6.0/developer/2_5_Objects_Fields_Methods/methods.html

Dariusz Żbikowski
na 26.05.2015, 12:00

PS. Cały czas jednak nie rozumiem dlaczego tak upierasz się przy tych przesunięciach. Tego formularza w zasadzie powinno się używać tylko od "wielkiego święta", kiedy nie chce sie nam zdefiniować reguł które zaspokoją zapotrzebowanie wygenerowane i złożone w lokalizacji docelowej.

Dariusz Żbikowski
na 26.05.2015, 12:06

Jak się dobrze przyjrzysz to w menu magazynu po lewej stronie masz do wyboru grupę "Operacje" oraz grupę "Śledzenie". Menu Przesunięcia nalezy do tej drugiej. Wnioski chyba nasuwają się same, co do czego służy! Przecież w operacjach też masz przesunięcia wewnętrzne, tyle tylko, że z wyższej warstwy loginczej systemu tj. masz Pobrania?!

Dariusz Żbikowski
na 26.05.2015, 12:50

No więc kontynuujemy :)

Dr.One
na 01.06.2015, 21:36

Idąc za podpowiedziami, zmieniłem nieco skrypt do formy bardziej przypominającej stare API.
W dalszym ciągu jednak cos jest nie tak ....

Rzućcie okiem proszę i powiedzcie, co tu jeszcze jest nie prawidłowo ? (wszystko?) 02.06.2015

from openerp import models, fields, api, _

class stock_location(osv.osv):

    _inherit = 'stock.location'

}

    def _get_current_stock(self):

        return res

        res = []

        quants = []

        for obj in self.browse(cr, uid, ids, context=context):

            if 'default_product_id' in context:

                quants = self.pool.get(['stock.quant'].search([('location_id','=',id),('product_id','=?',context['default_product_id'])]))

            else:

                quants = self.pool.get(['stock.quant'].search([('location_id','=',id)]))

                    for quant in quants:

                        res[obj.id] += quant.qty

    def _get_locations(self):

        return res

        res = []

        for quant in self.pool.get('stock.quants').browse(cr, uid, ids, context=context):

            if quant.location_id:

                res.append(quant.location_id.id)

    _columns = {

        'loca': fields.char('Location'),

        'qty': fields.function(_get_current_stock, type = "float", string = 'Qty', store = {'stock.quants': (_get_locations, ['location_id','qty'], 1 ) } ),


    def name_get(self):

        return res

        res = []

        for loc in self:

            res.append((loc.id, loc.name + " / " + str(loc.qty) + " Units" or ''))

Dr.One
Dr.One
341
| 5 3 5
Data odpowiedzi 26.05.2015, 13:09
0
głos

Myślę, że raczej wiem o co ci chodzi, wideo to potwierdza i dlatego odradzam. jeśli jednak swoje walki zakończysz sukcesem pewnie filozofię systemu będziesz miał już "w jednym palcu". Wybrałeś drogę najtrudniejszą i o tym piszę. Moim zdaniem "innym" nacjom wystarczy czasami nie pokazywać określonego menu aby nie było kłopotów. Po drugie zauważ jeszcze, że na widoku produktu, w zakładce Zapasy masz magiczny link "Złóż zapotrzebowanie" - to jest raczej droga o której ja myślę. Nie spotkałem się z taka organizacją pracy aby przesunięcia były dokonywane dla każdego produktu oddzielnie i tym samym indywidualnie dokumentowane. Spotykałem się jednak znacznie częściej z pojęciami "Pobrania" (czyli po ekonomicznemu WZ) i "Zapotrzebowania", dotyczącego zwykle listy produktów (jednego ewentualnie też).

Dariusz Żbikowski
na 26.05.2015, 20:41

Gdyby rozwiązanie twojego problemu było proste i szybkie już dawno otrzymałbyś konkretną podpowiedz. Niestety tak nie jest. Z tego też powodu przedstawiałem ci różne propozycje alternatywne. Zauważ, że twój magazynier winien raczej wiedzieć SKĄD przesuwa. Jeśli wie to ma dwie możliwości szybkiego działania, po prostu zna kod strefy, wpisuje go i nie powinno się zdarzyć aby mu zabrakło towaru. Dodatkowo może ewentualnie wykorzystać kod paskowy strefy. Problem postaje tylko wtedy, gdy magazynier chce przesunąć towar A do strefy X i nie ma pjęcia gdzie szukać towaru. Niech sobie wtedy wejdzie na widok towaru kliknie na klawisz "na składzie" i pozna strefy w z których ew. może ten towar pobrać. Na koniec zauważ jeszcze, że działając standardowo mogą się zdarzac przypadki kiedy towar jest już zarezerwowany dla innych pobrań/przesunięć, co wtedy? widzę raczej w efekcie koszmarny bałagan. Pojęć "ilości" jest w końcu kilka, jest ilość na stanie, ilość dostępna, ilość przewidywana - z której chcesz korzystać - jak na razie to chyba używasz tej na stanie?

Dariusz Żbikowski
na 27.05.2015, 09:10

Musisz sobie uświadomić jak działa zaproponowane przeze mnie wcześniej rozwiązanie programowe. Pole qty nie jest przeuszukiwalne bo nie jest zapamiętywane w bazie danych. Budowane jest "w locie" zależnie od wybranego w kontekscie produktu. Nie można go zapisać w bazie bo nie wisz jakiego produktu dotyczy. Nic ci nie da budowanie pól dodatkowych bo z nimi będzie ten sam problem. Lokalizacja nie posiada relacji jednoczesnej do produktów i na dokładkę do ich poszczególnych kwantów.

Dariusz Żbikowski
na 27.05.2015, 12:02

W każdym języku byłby podobny problem. Do tego co chcesz zrobić potrzebna jest tablica wielowymiarowa, potrzebujesz identyfikacji lokalizacji, produktu, kwantów i ilości a usiłujesz to wpakować w dwa wymiary. Forma kolegi z Pakistanu kompletnie nic tu nie zmienia. Ona nie zapisuje ("location_id" i "qty") lecz pola te służą jako wyzwalacze (triggery) dla wywołania funkcji. Gdzie planujesz zapisać i jak product_id związany z obliczoną ilością?

Dariusz Żbikowski
na 27.05.2015, 15:02

to... otrzymasz to samo co dawno już dostałeś.

Dariusz Żbikowski
na 27.05.2015, 15:32

Niezbyt wiem jaki ci mogę jeszcze pomóc, opisałem już chyba wszystkie sugestie jakie przyszły mi do głowy.

Dariusz Żbikowski
na 29.05.2015, 16:37

Bazę danych odtworzono z wczorajszej kopii zapasowej. Proszę ponownie dokonać publikacji dokonanych po godz 19.

Admin Odoo.co.pl
na 30.05.2015, 10:27

Problem w pomieszaniu nowego i starego api. Na temat idei już się wypowiadałem, daj znać jeśli Ci zadziała.

Dariusz Żbikowski
na 30.05.2015, 14:36

To nie jest pojedyńczy błąd, pomieszane jest wszystko.

Dariusz Żbikowski
na 30.05.2015, 15:49

Twoja odpowiedź

Spróbuj dać znacząca odpowiedź. Jeśli chcesz wypowiedzieć się na temat pytania lub odpowiedzi, po prostu użyj narzędzia komentowania. Proszę pamiętać, że zawsze można zrewidować swoją odpowiedź - nie ma potrzeby odpowiadać na to samo pytanie dwa razy. Także prosimy, nie zapomnij zagłosować - to naprawdę pomaga wybrać najlepsze pytania i odpowiedzi!

Zadaj Pytanie

Bądź na bieżąco

O tym forum

Forum dla profesjonalistów i entuzjastów systemu Odoo. Dyskusje, porady, opinie, komentarze.

Przeczytaj wytyczne

Narzędzia do pytań

3 obserwujący

Statystyki

Spytał/a: 21.05.2015, 21:52
Oglądano: 907 razy
Ostatnia aktualizacja: 22.09.2015, 13:31