Skocz do zawartości

[Sfera] Aktualizowanie załącznika w nowej bibliotece załączników 40+

Polecane posty

Posiadam pewne załączniki, które chciałbym aktualizować - mam w FZ załącznik, z niepowtarzalną globalnie nazwą pliku i chciałbym go nadpisać plikiem z dokładnie tą samą nazwą, w nowej wersji. Do wersji 40, po prostu tworzył się kolejny plik i nikt nie narzekał, a teraz wiadomo, jest błąd. Obecnie samo wczytanie obsługuje tak:

using (var dok = biblioteka.Utworz())
{
dok.Wczytaj(@"N:\temp\" + filename + "");
dok.DodajPowiazanie(fakturaZakupu);
if (!dok.Zapisz()) WriteLine("Błąd podczas dodawania załącznika.", ConsoleColor.White, ConsoleColor.Red);
else WriteLineInfo("Dodano załącznik: ", filename);
}

I teraz znalazłem metodę AktualizujZawartosc, której zapewne mógłbym tutaj użyć, ale pytanie, czy najpierw powinienem jednak poszukać załącznika o takiej nazwie, przypisanego do tego obiektu i go ewentualnie zaktualizować, czy jest to może funkcja "inteligentna" i wystarczy, że zastąpię Wczytaj, tą metodą i ona sama nadpisze plik lub utworzy, jeśli go nie ma - wiem, że dokumentacja na to totalnie nie wskazuje, ale wole się upewnić, a może podrasujecie funkcję ;)

A może jest jakiś parametr, aby wczytaj nadpisywało plik.

Link to postu
6 godzin temu, Radomił Ząbik napisał:

I teraz znalazłem metodę AktualizujZawartosc, której zapewne mógłbym tutaj użyć, ale pytanie, czy najpierw powinienem jednak poszukać załącznika o takiej nazwie, przypisanego do tego obiektu i go ewentualnie zaktualizować ...

Dokładnie tak trzeba zrobić. Najpierw wyszukać załącznik i jeżeli taki istnieje, to podmienić jego zawartość za pomocą metody AktualizujZawartosc.

 

6 godzin temu, Radomił Ząbik napisał:

czy jest to może funkcja "inteligentna" i wystarczy, że zastąpię Wczytaj, tą metodą i ona sama nadpisze plik lub utworzy, jeśli go nie ma

W sferze nie ma takiej metody i nie planujemy jej dodawać.

 

6 godzin temu, Radomił Ząbik napisał:

A może jest jakiś parametr, aby wczytaj nadpisywało plik.

Takiego parametru też nie ma.

Link to postu

Czyli znajduję załącznik powiązany z dokumentem i o tej samej nazwie pliku, jeśli jest to aktualizuje go przez AktualizujZawartosc (a Wczytaj też zadziała tak samo, bo mam inne funkcje, którymi tak właśnie aktualizowałem załącznik). Czyli chyba tak to najprościej osiągnąć, poprzez powiązanie z dokumentem - nie ma szansy na istnienie innego załącznika o tej nazwie, więc spokojnie mogę zrobić dopasowanie bezpośrednie:

            // załączanie pliku
            var obiekt = fz.Dane.BibliotekaZalacznikow.Where(p => p.Zalacznik.NazwaPliku == filename).Single();
            if(obiekt!=null)
							{
              var dok = biblioteka.Znajdz(obiekt.Zalacznik);
              if (dok != null)
                {
                dok.AktualizujZawartosc(@"N:\temp\" + filename + "");
                if (!dok.Zapisz()) WriteLine("Błąd podczas aktualizowania załącznika.", ConsoleColor.White, ConsoleColor.Red);
                else WriteLineInfo("Zaktualizowano załącznik: ", filename);
                }
              }
            else
							{
              using (var dok = biblioteka.Utworz())
                {
                dok.Wczytaj(@"N:\temp\" + filename + "");
                dok.DodajPowiazanie(fakturaZakupu);
                if (!dok.Zapisz()) WriteLine("Błąd podczas dodawania załącznika.", ConsoleColor.White, ConsoleColor.Red);
                else WriteLineInfo("Dodano załącznik: ", filename);
                }
              }

 

Link to postu

Przy założeniu, że w bazie albo jest załącznik związany z FZ, albo nie ma go wcale, to kod jest z grubsza właściwy. Zwrócę jednak uwagę na kilka ważnych szczegółów. Użycie metody Single w sytuacji, gdy w bazie nie ma żadnych załączników wywoła wyjątek i nie dojdzie do tego if, które jest poniżej. Lepsze byłoby tutaj użycie metody SingleOrDefault. Drugie miejsce, na które należy zwrócić uwagę to porównywanie nazwy plików. W bibliotece przechowywana jest nazwa bez rozszerzenia, więc musi Pan taką samą nazwę użyć w warunku Where. Kod ten nie sprawdzi się także, gdy w bibliotece będzie załącznik o takiej samej nazwie, ale nie powiązany z wskazanym FZ.

Link to postu
4 minuty temu, Paweł Kubacki napisał:

Przy założeniu, że w bazie albo jest załącznik związany z FZ, albo nie ma go wcale, to kod jest z grubsza właściwy. Zwrócę jednak uwagę na kilka ważnych szczegółów. Użycie metody Single w sytuacji, gdy w bazie nie ma żadnych załączników wywoła wyjątek i nie dojdzie do tego if, które jest poniżej. Lepsze byłoby tutaj użycie metody SingleOrDefault.

Racja popłynąłem.

4 minuty temu, Paweł Kubacki napisał:

Drugie miejsce, na które należy zwrócić uwagę to porównywanie nazwy plików. W bibliotece przechowywana jest nazwa bez rozszerzenia, więc musi Pan taką samą nazwę użyć w warunku Where.

Słuszna uwaga. Hmm, nie da się w LINQ (bo to chyba to jest), dodać jakiegoś CONCAT.

9 minut temu, Paweł Kubacki napisał:

Kod ten nie sprawdzi się także, gdy w bibliotece będzie załącznik o takiej samej nazwie, ale nie powiązany z wskazanym FZ.

Jeśli będzie załącznik, to tylko powiązany z FZ lub KFZ. Ale rzeczywiście może wystąpić sytuacja, że załącznik był w skasowanym FZ, więc może lepiej ogarnąć całą bibliotekę, zamiast iść przez powiązanie, słuszna uwaga.

Link to postu
×
×
  • Dodaj nową pozycję...