Skocz do zawartości

Jerzy Dudra

InsERT
  • Liczba zawartości

    302
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    1

Posty dodane przez Jerzy Dudra

  1. Jeżeli podmiot ma 'własne binaria' (znacznik w kolumnie binaria w programie serwisowym),

    to znaczy, że podmiot ma zmodyfikowany model danych (własna wersja dll'ki InsERT.Moria.ModelDanych.dll).

    Taka modyfikacja powstaje, gdy w podmiocie zdefiniowano pola własne w wersji 1.

    W rozwiązaniach korzystających z takiej bazy należy 'referencjonować' się do dll'ki  InsERT.Moria.ModelDanych.dll z tego podmiotu,

    a nie tej z SDK.

     

  2. 18 godzin temu, Jerzy Biesiadowski napisał:

    Jak się dogrywa binaria własne?

    W SDK w dokumencie InsERT.nexo.Sfera.chm w Zarządzanie rozwiązaniem | Instalacja

    2145004994_Instalacjapakietuwasnego.png.ea437b23299d353f0e9609239788c97d.png

    opisano jak wgrywać pakiety z rozwiązaniem własnym.

     

    Tworzenie pakietu własnego opisano w SDK, w dokumecie Wdrazamy_rozwiazanie_dla_nexo_PRO_wykorzystujace_Sfere_nexo.pdf (rozdział 1).

    Dokument ten bazuje na treści dokumentu Tworzymy_nowe_rozwiazanie_dla_Sfery_nexo_w_MS_Visual_Studio_2017.pdf, w którym opisano ciekawy sposób tworzenia rozwiązania własnego.

     

     

  3. Problem taki pojawia się, gdy w lokalizacji rozwiązania sferycznego nie ma pliku xsd.pak.

    Do tego pliku nie ma bezpośredniego odwołania (referencja) w bibliotekach nexo i kompilator nie kopiuje go do folderu wynikowego.

    Można skopiować ten plik (i jeszcze parę innych) z folderu bin (z SDK) do folderu, do którego kompilowane jest Pani rozwiązanie.

    W dokumentacji SDK (w Tworzymy_nowe_rozwiazanie_dla_Sfery_nexo_w_MS_Visual_Studio_2017.pdf Krok 5. Budowanie i uruchamianie (sprytnie))

    opisano, jak można obejść tę niedogodność, zmieniając katalog, do którego kompilowane jest rozwiązanie sferyczne).

  4. Wyłączenie FS jest trochę bardziej kłopotliwe niż włączanie.

    Udało mi się usunąć wykonując czynność analogiczne jak przy dodawaniu,  tylko w odwrotnej kolejności :)

     

    Jeżeli FS dodawano wg instrukcji z SDK to odwrotną procedurę można przeprowadzić poniższym skryptem.

    Należy pamiętać o przetestowaniu tego na kopii roboczej

    Należy skorygować nazwy tabel i baz danych

    I jeszcze raz pamiętać o archiwum przed wykonaniem operacji na bazie docelowej

    /* Odkręcanie FS na poziomie tabeli */
    --
    -- tutaj przykład dla tabeli [ModelDanychContainer].[ZawartosciDokumentow]
    -- baza danych nazywa się Nexo_ECP 
    -- jest to o tle istotne, że nazwa ta pojawia się przy usuwaniu grup 
    -- filesreamowych i przy "porządkowaniu" tablei
    -- grupa filesteramowa nazywa się [nexo_ECP.fst]
    -- 
    
    /* Backup (stare pole z FS)*/
    EXEC sp_rename '[ModelDanychContainer].[ZawartosciDokumentow].[Dane]', 'DaneBak', 'COLUMN';
    GO
    
    /* Nowe pole (bez FS)*/
    ALTER TABLE [ModelDanychContainer].[ZawartosciDokumentow]
    ADD
    [Dane] [varbinary](max) NULL
    GO
    
    /* Przepisanie wartości do „nowej” struktury  (bez FS)*/
    UPDATE ModelDanychContainer.ZawartosciDokumentow 
    SET
    Dane = DaneBak
    GO
    /* usunięcie „niepotrzebnej” już kolumny */
    ALTER TABLE [ModelDanychContainer].[ZawartosciDokumentow]
    DROP COLUMN
    DaneBak
    GO
    
    /* poniższy zabieg ma na celu usuniecie powiązań z grupą FS, bo dodawanie FS dodaje takowe */
    
    /* usunięcie i utworzenie PK_ZawartosciDokumentow*/
    ALTER TABLE [ModelDanychContainer].[ZawartosciDokumentow] 
    DROP CONSTRAINT [PK_ZawartosciDokumentow] WITH ( ONLINE = OFF )
    GO
    
    ALTER TABLE [ModelDanychContainer].[ZawartosciDokumentow] ADD  CONSTRAINT [PK_ZawartosciDokumentow] 
    PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) 
    ON [PRIMARY] 
    GO
    
    ALTER TABLE [ModelDanychContainer].[ZawartosciDokumentow]
    SET (FILESTREAM_ON = "NULL")
    
    
    ALTER DATABASE [Nexo_ECP] REMOVE FILE [nexo_ECP.fst]
    GO
    ALTER DATABASE [Nexo_ECP] REMOVE FILEGROUP [FileStreamGroup]
    GO
    
    /* porządkowanie */
    DBCC CLEANTABLE 
    (Nexo_ECP,'[ModelDanychContainer].[ZawartosciDokumentow]', 512)
    GO
    
    /* Odbudowa indeksów */
    ALTER INDEX ALL ON [ModelDanychContainer].[ZawartosciDokumentow]
    REBUILD; 
    GO

     

  5. Faktycznie jest problem z dynamicznymi sql'ami, gdy dynamicznie generowana jest struktura wyniku zapytania.

    Wynika to z tego, że na potrzeby generowania kolumn, wykonywane jest zapytanie zwracające strukturę, które może zachowywać się inaczej niż "pełne zapytanie". Podyktowane to było względami wydajnościowymi.

    W poniższym przykładzie widać, że instrukcja IF działa w trybie "pytania o strukturę" inaczej niż instrukcja CASE. 

     

    DECLARE @sql NVARCHAR(max)
    DECLARE @lineFromIF NVARCHAR(500)
    DECLARE @lineFromCASE NVARCHAR(500)
    DECLARE @wajcha INT = 1
    
    IF @wajcha=1 
    BEGIN
    	set @lineFromIF = N', ''IF pierwsza'' as [IF Pierwsza]'
    END
    ELSE IF @wajcha=2
    BEGIN
    	set @lineFromIF = N', ''IF druga'' as [IF Druga]'
    END
    ELSE
    BEGIN
    	set @lineFromIF = N', ''IF trzecia'' as [IF Trzecia]'
    END
    
    set @lineFromCASE = N', ' + CASE 
    						WHEN @wajcha = 1 THEN	N'''CASE Pierwsza''		as [CASE Pierwsza]'
    						WHEN @wajcha = 2 THEN	N'''CASE Druga''		as [CASE Druga]'
    						ELSE 
    												N'''CASE Trzecia''		as [CASE Trzecia]'
    					END
    
    set @sql = N'SELECT Id,Symbol, Nazwa '
    +	@lineFromIF
    +	@lineFromCASE
    +	N' FROM ModelDanychContainer.Asortymenty'
    PRINT @sql
    
    EXEC sp_executesql @sql;

    Postaramy się jakoś zaadresować ten problem, ale na teraz nie widzę eleganckiego rozwiązania tego problemu.

  6. W Raporcie własnym Linq można  użyć funkcji:

    System.Data.Entity.DbFunctions.DiffDays(..)

    w treści zapytania wygląda to np. tak:

    source
        .Select((Rozrachunek r) => new Wynik
        {
            Id = r.Id,
            DataUtworzenia= r.DataPowstania,
            Dni = System.Data.Entity.DbFunctions.DiffDays(DateTime.Today,r.DataPowstania),
        });

  7.  

    Delphi potrafi skorzystać z komponentów COM.
    Można zrobić rozwiązanie pomostowe, udostępniające potrzebne w Deplhi funkcje jako elementy COM.
    Taki "pomost" to biblioteka .net z flagą COM-Visible (VisualStudio | Ustawienia projektu | Application | Assemby information | COM-Visible).


    W rozwiązaniu należy zdefiniować interface, którym będziemy się posługiwać "COMowo" z zewnątrz (np. z Delphi)


    Po stronie .net mogłoby to być coś takiego:

    namespace nexoAPI
    {   
    
        public interface IAkcjaNexo   
        {       
            void DodajKlienta(string symbol, string nazwa, string nip);   
        }   
        
        public class AkcjaNexo : IAkcjaNexo   
        {       
            public void DodajKlienta(string symbol, string nazwa, string nip)       
            {           
                var fabryka = FabrykaUchwytow.UtworzFabryke();           
                using (Uchwyt u = fabryka.Utworz())           
                {               // akcja na sferze           
                }   
            }
        }
    }


    Rozwiązanie takie należy zarejestrować (polecenie regasm.exe);
    Wtedy w językach skryptowych można utworzyć obiekt klasy AkcjaNexo
    i używać metod z interfejsu IAkcjaNexo.
     

  8. Jak pisałem wcześniej, nowe API do dodawania zdjęć pojawi się w jednej z najbliższych wersji.

     

    Rozwiązanie opisane tutaj:

     

    również powinno zadziałać.

     

    using InsERT.Mox.BibliotekaDokumentow.ObiektyBiznesowe;
    ...


            public void DodajZdjecie(IAsortyment towar, string nazwa, string typ, byte[] content)
            {
                var mediaDokumenty = towar.MediaDokumenty();
                _ = mediaDokumenty.ImportujMediaDokument(content, nazwa, typ);

                return towar;
            }
     

    • Dziękuję 1
  9. API do biblioteki załączników jest i można go użyć do dodania dowolnych plików np. obrazków. to towarów.

    Gdy pojawi się API do zdjęć, będzie można napisać rozwiązanie, które "przepisze"

    obrazki z biblioteki załączników do zdjęć towarów.

    Być może biblioteka załączników okaże się wystarczająco dobra dla Pana wdrożenia.

  10. Opisana przez Pana procedura wygląda prawidłowo.

    Jeżeli kopiował Pan pliki z folderu, którego używa nexo (tak jak Pan to opisał) to plik InsERT.Moria.Security.Core.dll  raczej jest tam gdzie trzeba.

    Plik InsERT.Moria.Security.Core.dll  powinien być tam gdzie binaria nexo (nie w folderze x86).

    Czy rozważał Pan wdrożenie rozwiązania poprzez pakiet.

    Takie rozwiązanie umieszcza aplikację w folderze z binariami nexo.

    W SDK opisano jak utworzyć i wdrożyć pakiet z rozwiązaniem własnym

    (Wdrazamy_rozwiazanie_dla_nexo_PRO_wykorzystujace_Sfere_nexo.pdf, Tworzymy_nowe_rozwiazanie_dla_Sfery_nexo_w_MS_Visual_Studio_2017.pdf  )

     

  11. Potwierdzam problem.

    Doraźnie można zastąpić tabelę tymczasową "zwykłą" tabelą, którą w treści raportu przed wyliczeniem można czyścić,  np. jakoś tak:

    Tworzenie tabeli roboczej (np. w Management Studio)

    CREATE TABLE dbo.RoboczaTabelaRaportu
    (
    	ID INT NOT NULL,
    	Tekst NVARCHAR(50), 
    )

    i w raporcie:

    -- "Czyszczenie" tabeli roboczej
    TRUNCATE TABLE dbo.RoboczaTabelaRaportu
    
    -- Wypełnianie
    INSERT INTO RoboczaTabelaRaportu VALUES(1, 'A')
    INSERT INTO RoboczaTabelaRaportu VALUES(2, 'B')
    INSERT INTO RoboczaTabelaRaportu VALUES(3, 'C')
    
    -- Zapytanie
    SELECT * FROM dbo.RoboczaTabelaRaportu

    Problem z tabelą tymczasową wynika z tego, że raport SQL przed uruchomieniem sprawdza strukturę zapytania, bez wykonywania go (używa flagi SET FMTONLY ON), co powoduje, że tabela tymczasowa nie powstaje. Stąd komunikat błędu.

     

    Można rozważyć również zastąpienie tabeli tymczasowej zmienną tabelaryczną. Zapytanie w raporcie mogło by  wyglądać tak:

    DECLARE @MyT TABLE 
    (
    	ID INT NOT NULL,
    	Tekst NVARCHAR(50)
    )
    ;
    
    INSERT INTO @MyT VALUES(1, 'A')
    INSERT INTO @MyT VALUES(2, 'B')
    INSERT INTO @MyT VALUES(3, 'C')
    
    SELECT * FROM @MyT

     

  12. Sfera nie udostępnia takiej funkcjonalności (dostęp do danych z GUS).

    Obecnie nie jest planowane dodanie do Sfery takiej funkcjonalności.

    W chwili obecnej jedynym rozwiązaniem jest samodzielne skorzystanie z serwisu GUS.

    Dokumentację na ten temat można znaleźć np. tutaj:

     

     

×
×
  • Dodaj nową pozycję...