Proedura - nie działa parametr?

0

Koledzy,
Poproszę Was o pomoc, (...) się buntuje :-).

Procedura ma dwie części. Uruchamiana jest codziennie o 23:30.

Każdego pierwszego dnia miesiąca ma wykonywać część 1. Parametr DATA.
Każdego innego dnia część 2.
Jednak ZAWSZE uruchamia się część 2.
I już straciłem koncepcję co mam zrobić.

Zapytania wykonane z "palca" działają nie ma żadnych błędów w logach.

Procedura.txt

2

Szczerze mówiąc tytuł wątku nijak się ma do treści posta, podobnie jak tag.

Nie podałeś też z jakim DBMS pracujesz ani w jakiej wersji.

Zastanawia mnie pokrętny sposób sprawdzania, jaki jest dzień miesiąca:

-- Sprawdzanie daty dzisiejszej.
DECLARE @Dzis DATE;
DECLARE @Pierwszy DATE;

SET @Dzis = CONVERT(DATE,GETDATE());
SET @Pierwszy = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE()-1 ),GETDATE()));

-- Sprawdzenie PIERWSZY dzieñ miesi¹ca.
IF @Pierwszy = @Dzis

Nie prościej byłoby użyć DAY()?

IF DAY(GETDATE()) = 1
0

A co ci powiedział debuger? Co ci się wylicza w tym pierwszym? Możesz użyć też zwykłych printów albo zrzucać do jakieś tabelki z logami informacje debugowe.
Co mi jeszcze przyszło do głowy, że convert nie obcina dobrze typów i tam siedzą jakieś syfy. Możesz spróbować tego zaproponował @superdurszlak albo

datediff( day, @Pierwszy, @Dzis) =0
0

Ze skladni wynika że to tsql, więc rozwiazanie @superdurszlak jest najbardziej intuicyjne: day(GETDATE())=1

dla mnie jednak cały ten if jest niepotrzebny:

DECLARE @d int;
DECLARE @data DATE;

SET @data = CONVERT(DATE,GETDATE());
SET @d = day(@data)
BEGIN TRY
    BEGIN TRANSACTION
    
    -- Wstawiamy sprzdaż za poprzedni miesiąc. Ograniczenie zakresu dat w WIDOKU.
    INSERT dbo.HANDEL_MSC (TWR_NUMER,TWR_NAZWA,KTR_NUMER,KTR_NAZWA,DOKUMENT,SPRZ_DATA_SPRZ,ILOSC,WARTOSC,NETTO,SLJM_KOD)
    SELECT 
      dbo.VG_SPRZEDAZ_HURT.TWR_NUMER,
      dbo.VG_SPRZEDAZ_HURT.TWR_NAZWA,
      dbo.VG_SPRZEDAZ_HURT.KTR_NUMER,
      dbo.VG_SPRZEDAZ_HURT.KTR_NAZWA,
      dbo.VG_SPRZEDAZ_HURT.DOKUMENT,
      dbo.VG_SPRZEDAZ_HURT.SPRZ_DATA_SPRZ,
      dbo.VG_SPRZEDAZ_HURT.ILOSC,
      dbo.VG_SPRZEDAZ_HURT.WARTOSC,
      dbo.VG_SPRZEDAZ_HURT.NETTO,
      dbo.VG_SPRZEDAZ_HURT.SLJM_KOD
    FROM
      dbo.VG_SPRZEDAZ_HURT
	WHERE
		@d=1
    
    -- Kopiuje dane CENY z tabeli TEMP do MSC.
    INSERT INTO dbo.CENY_HANDEL_MH(INDEKS,NAZWA,CENA,DATA)
    SELECT DISTINCT
      dbo.CENY_HANDEL_TEMP.INDEKS,
      dbo.CENY_HANDEL_TEMP.NAZWA,
      dbo.CENY_HANDEL_TEMP.CENA,
      dbo.CENY_HANDEL_TEMP.[INSERT]
    FROM
      dbo.CENY_HANDEL_TEMP
      INNER JOIN dbo.HANDEL_MSC ON (dbo.CENY_HANDEL_TEMP.INDEKS = dbo.HANDEL_MSC.TWR_NUMER)
    WHERE
      dbo.CENY_HANDEL_TEMP.[INSERT] < @data
	  AND @D=1
    
    -- Kasujemy tabelę tymczasową CEN.
    DELETE dbo.CENY_HANDEL_TEMP
	WHERE
		(@d=1)
		or (@d>1 and dbo.CENY_HANDEL_TEMP.[INSERT] = @data);

    -- Wstawiamy dane do tabeli.
    INSERT INTO dbo.CENY_HANDEL_TEMP (INDEKS,NAZWA,CENA,DATA)
    SELECT
      dbo.VG_HANDEL_ANALIZA_MH.INDES,
      dbo.VG_HANDEL_ANALIZA_MH.NAZWA,
      dbo.VG_HANDEL_ANALIZA_MH.CENA,
      dbo.VG_HANDEL_ANALIZA_MH.DATA
	FROM
      dbo.VG_HANDEL_ANALIZA_MH;
 
    COMMIT TRANSACTION
 END TRY
 BEGIN CATCH
  ROLLBACK TRANSACTION;
  -- Te linie służą do rejestracji błedów procedur.
  INSERT INTO dbo.PROCEDURE_ERROR (ErrorNumber, ErrorSeverity, ErrorState, ErrorProcedure, ErrorLine, ErrorMessage)
  SELECT
   ERROR_NUMBER() AS ErrorNumber,
   ERROR_SEVERITY() AS ErrorSeverity,
   ERROR_STATE() AS ErrorState,
   ERROR_PROCEDURE() AS ErrorProcedure,
   ERROR_LINE() AS ErrorLine,
   ERROR_MESSAGE() AS ErrorMessage
END CATCH
0

Już uzupełniam,
Serwer: MS SQL 17.9.1

DECLARE @Dzis DATE;
DECLARE @Pierwszy DATE;

SET @Dzis = CONVERT(DATE,GETDATE());
SET @Pierwszy = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE()-1 ),GETDATE()));

SELECT
@Dzis,
@Pierwszy

Zwraca:
2020-12-17,
2020-12-01

Auto-attach to process '[5504] [SQL] TECHNOLOG3' on machine 'TECHNOLOG3' succeeded.
The thread 'TECHNOLOG3\SQLEXPRESS [53]' (0x2ddc) has exited with code 0 (0x0).
The thread 'TECHNOLOG3\SQLEXPRESS [53]' (0x2ddc) has exited with code 0 (0x0).
The program '[5504] [SQL] TECHNOLOG3: TECHNOLOG3\SQLEXPRESS' has exited with code 0 (0x0).

Zmienię na DAY i zobaczymy :-)
Dziękuję za podpowiedź, na tak "proste" rozwiązanie nie wpadłem !!!

Sprawdzam tak na Szybko zdalnie.
-- Kasujemy tabelę tymczasową CEN.
DELETE dbo.CENY_HANDEL_TEMP
WHERE
(@d=1)
Ta linijka poniżej jest zbędna? Kasowanie TEMP ma być tylko "1" każdego miesiąca. Dobrze myślę?
or (@d>1 and dbo.CENY_HANDEL_TEMP.[INSERT] = @data);

0

No nie jest zbędna, ponieważ wg. Kodu który podałeś dla pierwszego dnia miesiąca usuwasz wszystkie rekordy, a dla każdego innego dnia tylko dane z daty wykonania procedury. I ta alternatywa (or) to właśnie realizuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1