Duża Hydra - porównanie dat przed zapisem faktury

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

Tyriado
Posty: 62
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Duża Hydra - porównanie dat przed zapisem faktury

Post autor: Tyriado »

Cześć. Chciałbym nauczyć się częściowo jak tworyzć dużą hydrę. Pomyślałem, ze na początku zrobię jedynie komunikat podczas zapisu FSa. POtem dorobię warunek (aby sprawdzić, czy w ogóle dobrze to piszę). Zacząłem szukać w dokumentacji, pomocy i napisałem coś takiego:

Kod:

Kod: Zaznacz cały

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Hydra;
using System.Windows.Forms;

[assembly: CallbackAssemblyDescription(Name: "Wiadomosc",
                                        Description: "Pokazuje Wiadomosc",
                                        Author: "T",
                                        Version: "0.1",
                                        SystemVersion: "2025.0",
                                        Created: "15-05-2025")]

namespace WinFormsLibrary1
{
    [SubscribeProcedure(Procedures.TrN_FS, "PokazWiad")]

    public class WinFormsLibrary1Name : Callback
    {
        public override void Init()
        {
            AddSubscription(true, 0, Events.OpenWindow, (procID, ctrlID, eveID) =>
            {
                AddSubscription(true, GetWindow().Children["?Cli_Zapisz"].Id, Events.Accepted, (procedureID, controlID, eventID) =>
                {
                    MessageBox.Show("OK", "OK", MessageBoxButtons.OK, MessageBoxIcon.Stop);

                    return true;

                });
                return true;
            });
        }
        public override void Cleanup()
        {
        }
    }
}
W ogóle nie mogę podłączyć tego dodatku nawet. Podczas importu mam błąd:
Obrazek

Jak rozumiem importuję zbuildowany .dll? Coś źle napisałem? Źle wybrałem "bibliotekę klas" jako taką z Windows.Forms? Zła wersja .NET? Musi być 4.5.1 (taka znalazłem w jakieś starszej dokumentacji w internecie)?

Dzięki za pomoc.

rolski95
Posty: 121
Rejestracja: 21 lut 2019, 08:24
Rola: Administrator CDN XL

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: rolski95 »

Czy masz tak ustawione w VS?
2025-05-20_23h21_15.png
2025-05-20_23h21_15.png (2.43 KiB) Przejrzano 208 razy

Tyriado
Posty: 62
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: Tyriado »

Mam 4.5.1 zamiast 4.8.1. Zmienię, i zobaczę czy to coś da. Wwoją drogą może ktoś mi napisać jak dodać nowy przycisk na formatce i go "ustawić". Jaki mały przykład. Bo chciałbym potem wywołać z niego "akcję". Nie znalazłem jednak żadnego przykładu, jak tworzy się przyciski. Nie wiem, czy typowo jak w Windows.Forms, czy jest zupełnie inna składnia.

rolski95
Posty: 121
Rejestracja: 21 lut 2019, 08:24
Rola: Administrator CDN XL

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: rolski95 »

Kod: Zaznacz cały

using System;
using System.Windows.Forms;

[assembly: CallbackAssemblyDescription(Name: "template",
                                       Description: "HydraTemplate481",
                                       Author: "abc",
                                       Version: "1.0",
                                       SystemVersion: "2022.2",
                                       Created: "04-09-2023")]
namespace HydraTemplate481
{
    [SubscribeProcedure(Procedures.ListaRejestrVAT, "HydraTemplate481")]
    public class Main : Callback
    {
        ClaWindow mainWindow, claButton;
        public override void Init()
        {
            try
            {
                AddSubscription(false, 0, Events.OpenWindow, new TakeEventDelegate(OpenWindow));
                AddSubscription(false, 0, Events.ResizeWindow, new TakeEventDelegate(OnResizeWindow));
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
        public bool OpenWindow(Procedures ProcId, int ControlId, Events Event)
        {
            try
            {
                mainWindow = GetWindow();
                claButton = mainWindow.AllChildren.Add(ControlTypes.button);
                claButton.ToolTipRaw = "TestButtonTooltip";
                claButton.TextRaw = "TestButton";
                SetPosition(claButton,mainWindow.AllChildren["?BtnOCR"]);
                claButton.Visible = true;
                AddSubscription(false, claButton.Id, Events.Accepted, new TakeEventDelegate(BtnClick));
                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return false;
            }
        }
        bool BtnClick(Procedures ProcId, int ControlId, Events Event)
        {
            try
            {
                MessageBox.Show("ButtonClicked");
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return false;
            }
        }
        public bool OnResizeWindow(Procedures ProcId, int ControlId, Events Event)
        {
            try
            {
                SetPosition(claButton, mainWindow.AllChildren["?BtnOCR"]);
                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return false;
            }
        }
        public  void SetPosition(ClaWindow targetControl, ClaWindow sourceControl)

        {
            int x = int.Parse(sourceControl.XposRaw),
                y = int.Parse(sourceControl.YposRaw),
                sWidth = int.Parse(sourceControl.WidthRaw),
                sHeight = int.Parse(sourceControl.HeightRaw);
                targetControl.Bounds = new Rectangle(x + 20, y + 20, sWidth, sHeight);
            Runtime.WindowController.PostEvent(sourceControl.Id, Events.FullRefresh);
        }
        public override void Cleanup()
        {

        }
    }
}


Tyriado
Posty: 62
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: Tyriado »

Dzięki, zamiana na 4.8.1 pomogła i to, co napisałem wyżej zadziałało od razu. Po modyfikacji zrobiłem nawet porównanie dat przy próbie zapisu dokumentu Spinacza, które także działa. Dziękuję za przykład, muszę go na spokojnie przeanalizować. Jak rozumiem większa dokumentacja to u Partnerów tylko, normalnie jest jedynie ta strona pomocy z Małą/Dużą Hydrą?

A jak mogę "aktualizować" dodatek. Musze go usuwać, importować od nowa i ustawiać w strukturze, czy wystarczy zrobić ponowny import i on się "aktualizuje"? Jakbym chciał coś "testować" pisząc?

StabiL
Posty: 69
Rejestracja: 28 cze 2017, 15:41
Rola: Konsultant CDN XL

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: StabiL »

Tyriado pisze:
22 maja 2025, 11:03
Dzięki, zamiana na 4.8.1 pomogła i to, co napisałem wyżej zadziałało od razu. Po modyfikacji zrobiłem nawet porównanie dat przy próbie zapisu dokumentu Spinacza, które także działa. Dziękuję za przykład, muszę go na spokojnie przeanalizować. Jak rozumiem większa dokumentacja to u Partnerów tylko, normalnie jest jedynie ta strona pomocy z Małą/Dużą Hydrą?

A jak mogę "aktualizować" dodatek. Musze go usuwać, importować od nowa i ustawiać w strukturze, czy wystarczy zrobić ponowny import i on się "aktualizuje"? Jakbym chciał coś "testować" pisząc?
To to na stronie pomocy to wszystko co Comarch daje. Wcześniej było to dostępne na stronie partnerów na pewno, potem przenieśli do WWW i tyle zostało. Reszta to albo metoda doświadczalna (prób i błędów) albo pisanie do Comarchu jak już gdzieś się definitywnie utknie.

Co do aktualizacji wystarczy, że go zaimportujesz ponownie i klikniesz odśwież w programie. Najlepiej robić to na głównym oknie danego modułu lub jak kto woli nie odświeżać dodatku, gdy jest się w miejscu, na którym ten dodatek działa.
Zdarza się też, przynajmniej u mnie, że dodatek nie załaduje się za pierwszym razem po odświeżeniu. Jak mam coś na otwarcie okna np. WZ to dopiero za drugim razem dodatek wykonuje logikę.

Tyriado
Posty: 62
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: Tyriado »

Ok, przycisk ogarnąłem, pobawiłem się kodem i nawet dodałem to, co potrzebuję. Zobaczyłem także jak działa. Jak się domyślam podobniue dodaje się zakładki, z tym, że nie jako button, a jako "ControlTypes.tab".

A jak mógłbym uzyskać coś takiego jak te dane z wykresu dla zaznaczonych pozycji?

Kod: Zaznacz cały

@PAR ?@HS50|ZazGUID|&ZazGUID:REG= @? PAR@

select 1 as ID, Trn_GidTyp,Trn_GidNumer
FROM CDN.WkrZaznaczenia2
JOIN CDN.TraNag ON WkZ2_GIDNumer = Trn_GIDNumer AND WkZ2_GIDTyp = Trn_GIDTyp
WHERE WkZ2_GUID=??ZazGUID
Jak mogę wywołać select? Jak rozumiem z definiciji jestem już połączony z bazą danych w racji samego "Dodatku" do XLa?

Ogólnie mam rozwiązanie oparte o procedurę. Chciałbym to zmienić na przycisk, który na liście dokumentów wywołuje procedurę dla zaznaczonych dokumentów. Do tego potrzebuję Trn_GIDNumer i Trn_GIDTyp, które będę mógł przekazać dalej. Jakieś sqlQuery? Już to potem obrobię czystym .exe do wydruku, który mam. Chociaż znalazłem, że jest metoda WykonajWydruk(), która pewnie ma podobne parametry jak ta z API, więc mógłbym to "złączyć". Znalazłem jeszcze to:
Odczyt zaznaczonych pozycji
Na listach została udostępniona możliwość odczytu zaznaczonych pozycji. Przykład tego rozwiązania można odnaleźć w materiałach dodatkowych w pliku listazaznaczonych.cs.
I to chyba by mi pomogło, ale nie mam pliku ;)

Ewentualnie pobranie FiltrSQL z otwartego dokumentu, to przeniosę button do formatki dokumentu i najwyżej sprawdzę stan, czy dokument jest zatwierdzony (więc w sumie i tak praca na bazie selectów).

JarekZ
Posty: 148
Rejestracja: 02 paź 2014, 14:11
Rola: Administrator CDN XL
Lokalizacja: Bielsko Biała
Kontakt:

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: JarekZ »

Kod: Zaznacz cały

private List<int> getIdsFromList(string listName, Procedures procId, int typ_dok)
        {
            List<int> ids = new List<int>();

            int listaId = GetWindow().AllChildren[listName].Id;
            ADODB._Recordset recordset = Runtime.WindowController.GetQueueMarked((int)procId, listaId, GetCallbackThread());
            try
            {
                
                if (recordset != null && recordset.RecordCount > 0)
                {
                    int GIDNumer;
                    recordset.MoveFirst();
                    while (recordset.EOF == false)
                    {
                        ADODB.Fields fields = recordset.Fields;

                        if ((Convert.ToInt32(fields["TYP"].Value) == typ_dok) || (typ_dok == 0))
                        {
                            GIDNumer = Convert.ToInt32(fields["NUMER"].Value);
                            ids.Add(GIDNumer);
                        }

                        recordset.MoveNext();
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            return ids;
        }

funkcja zwraca listę gidnumerów z zaznaczonych rekordach - oczywiscie jak to w Comarchu nie na wszystkich listach działa.

wywołanie np dla zamówień :

Kod: Zaznacz cały

  List<int> ids = getIdsFromList("?ListaZam", ProcedureId, 960);

JarekZ
Posty: 148
Rejestracja: 02 paź 2014, 14:11
Rola: Administrator CDN XL
Lokalizacja: Bielsko Biała
Kontakt:

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: JarekZ »

a tak jeszcze po za tematem....
widzieliście nowe struktury logowania w API wer.2025?
dodane jest pole KLUCZAPI - tak więc lada chwila API będzie licencjonowane osobno......
Nie dość, że drogi system, wygląda jak z systemy 30 lat temu, ciągle coś nie działa to jeszcze szukają gdzie tu skroić z kasy.....ehhh :(

Tyriado
Posty: 62
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Duża Hydra - porównanie dat przed zapisem faktury

Post autor: Tyriado »

Dziękuję. W miarę rozumiem. Moze nie od razu, ale musze przeanalizować. A jak w przypadku pobrania GIDa (bądź całego filtraSQL) z otwartego dokumentu? Tak będzie mi dużo łatwiej to potem ogarnąć niż "wsadowo". Przynajmniej na początku. Dla małej hydry było proste {filtrSQL} lub {trn_gidnumer}. Może nie wiem ja nie umiem czytać tej pomocy, ale ja nie rozumiem tej dokumentacji w pomocy. Jak widzę przykład, zrozumiem jak to się odbywa, ale tak w kolejności podpunktów to nie mogę tego zrozumieć.

Co do KLUCZAP, ciekawe czy mimo wszystko jak skorzystasz ze "starej" dllki będzie wymagało kluza.

ODPOWIEDZ