Skocz do zawartości

Przepisanie kodu kreskowego z innego pola

Polecane posty

Jeżeli dobrze rozumuję, mechanizm kodów kreskowych w bazie danych obejmuje tabele Asortymenty, JednostkiMiarAsortymentów oraz KodyKreskowe.

Sytuacja jest zasadniczo prosta - każdy asortyment ma u nas jedną jednostkę miary (w sumie nawet taką samą - szt).

Czy jest możliwość zbiorczego ustawienia kodu kreskowego? (Mógłbym wtedy na poziomie bazy danych sobie je zbiorczo przepisać z pliku lub innego pola).

Jeśli nie, czy jest jakaś możliwość przepisania przykładowo wszystkich symboli asortymentu na ich kody kreskowe? W tabeli KodKreskowe widzę, że są tylko rekordy asortymentów, które mają nadane kody kreskowe. Trzeba by utworzyć dla wszystkich asortymentów nowe rekordy w tabeli KodyKreskowe, ale właśnie nie wiem, jak to będzie wyglądało od strony Subiekta, czy nie będzie generowało jakiś błędów? Co wtedy z polem TimeStamp?

Może ktoś ma jeszcze inny pomysł?

Link to postu

Towar na magazynie posiada naklejki z kodem, dokładnie QR który zawiera symbol (niestety czasem ze spacjami i innymi znakami).

Przykładowa sytuacja: Mamy 3 asortymenty z symbolami:

ASD.QW aa

ASD.QW bb

ASD.QW cc

Jeżeli zeskanujemy kod ASD.QW bb lub ASD.QW cc (czytnik automatycznie wpisze kod i wyśle "enter") to na dokumencie i tak wstawi się pozycja ASD.QW aa, bo wyskakuje jako pierwsza na liście insTYNKTU.

Z moich testów wynika, że tylko przy polu KOD KRESKOWY sprawdzana jest dokładna zgodność, a nie tylko dowolne wyrażenie oddzielone spacją, dlatego chciałbym tam przepisać dane z pola SYMBOL

Link to postu

Bo ma Pan dobry pomysł, a pyta Pan o inny. :) Można to zrobić tak jak Pan pisze w pierwszym poście. Dla podstawowej j.m. należy dodać rekord z kodem kreskowym. JednostkaMiaryAsortymentuZKodemPodstawowym_Id powinna być ustawiona tak jak JednostkaMiaryAsortymentu_Id jeśli jest to jedyny kod kreskowy dla tej jednostki. Jedynym problemem mogłaby być wymagana unikalność kodów, ale skoro przepisze je Pan z symboli, które są unikalne, to będzie ok. Należy przy tym pominąć nieaktywne elementy (czyli dodać warunek IsInRecycleBin=0), bo one mogą mieć powielony symbol. Pole Timestamp wypełni się z automatu.

Edytowane przez Jarek K.
Link to postu

Mam rozwiązanie:

SET ANSI_WARNINGS  OFF;
INSERT INTO ModelDanychContainer.KodyKreskowe (Kod, JednostkaMiaryAsortymentu_Id, JednostkaMiaryAsortymentuZKodemPodstawowym_Id)
SELECT 
    Asortymenty.Symbol
    ,JednostkiMiarAsortymentow.Id
    ,JednostkiMiarAsortymentow.Id 
	
FROM 
    Modeldanychcontainer.Asortymenty
    INNER JOIN Modeldanychcontainer.JednostkiMiarAsortymentow ON JednostkiMiarAsortymentow.Asortyment_Id=Asortymenty.Id

EDIT:

Niestety jednak generuje błąd przy próbie dodania asortymentu na dokument:

Cytat

System.Reflection.TargetInvocationException: Obiekt docelowy wywołania zgłosił wyjątek.
   w System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   w System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   w System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   w System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   w System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   w InsERT.Mox.UIFramework.InstallErrorsEventHandlerValidationRule.GetValue(Object dataContext, String attribute)
   w InsERT.Mox.UIFramework.InstallErrorsEventHandlerValidationRule.GetValue(Object valueSource, String[] path, Int32 current, Int32 max)
   w InsERT.Mox.UIFramework.InstallErrorsEventHandlerValidationRule.GetValue(Object valueSource, String[] path, Int32 current, Int32 max)
   w InsERT.Mox.UIFramework.InstallErrorsEventHandlerValidationRule.GetValue(Object valueSource, String[] path, Int32 current, Int32 max)
   w InsERT.Mox.UIFramework.InstallErrorsEventHandlerValidationRule.GetValue(Object valueSource, String[] path, Int32 current, Int32 max)
   w InsERT.Mox.UIFramework.InstallErrorsEventHandlerValidationRule.GetSourceEntity(Object source, String[] split)
   w InsERT.Mox.FlexEditableGrid.BusinessErrorManager.ObtainTypedDataErrorInfo(Object source, String[] split)
   w InsERT.Mox.FlexEditableGrid.BusinessErrorManager.UpdateItemInErrorLookup(CWIRItem item)
   w InsERT.Mox.FlexEditableGrid.BusinessErrorManager.item_PropertyChanged(Object sender, PropertyChangedEventArgs e)
   w InsERT.Mox.Helpers.PropertyChangedNotifier.OnPropertyChanged(String propertyName)
   w InsERT.Mox.FlexEditableGrid.Collections.CollectionWithInsertionRow.AddNew(Object[] newItems)
   w InsERT.Mox.FlexEditableGrid.FlexEditableGrid.CreateAndInsertNewItem(Object newValue, String field)
   w InsERT.Mox.FlexEditableGrid.FlexEditableGrid.OnCellEditEnded(CellEditEventArgs e)
   w C1.WPF.FlexGrid.EditHandler.FinishEditing(Boolean cancel)
   w InsERT.Mox.FlexEditableGrid.FlexEditableGrid.FinishEditingWithDiagnostics()
   w InsERT.Mox.FlexEditableGrid.FlexEditableGrid.FinishEditingAndMoveFocus()
   w InsERT.Mox.FlexEditableGrid.FocusManagement.CellEditEndedCommandAction.Invoke(RoutedEventArgs args)
   w InsERT.Mox.WpfControls.EventTrigger.ExecuteActionCore(EventAction action, RoutedEventArgs args)
   w InsERT.Mox.WpfControls.EventTrigger.<RegisterEvent>b__0(Object sender, RoutedEventArgs args)
   w System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   w System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   w System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   w System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
   w InsERT.Mox.WpfControls.InstynktControl.OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   w System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   w System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   w System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   w System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   w System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   w System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   w InsERT.Mox.WpfControls.InstynktControl.set_Value(Object value)
   w InsERT.Mox.WpfControls.InstynktControl.OnPreviewKeyDown(KeyEventArgs e)
   w System.Windows.UIElement.OnPreviewKeyDownThunk(Object sender, KeyEventArgs e)
   w System.Windows.Input.KeyEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   w System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   w System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   w System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   w System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   w System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   w System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   w System.Windows.Input.InputManager.ProcessStagingArea()
   w System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   w System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   w System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawKeyboardActions actions, Int32 scanCode, Boolean isExtendedKey, Boolean isSystemKey, Int32 virtualKey)
   w System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(MSG& msg, Boolean& handled)
   w System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(MSG& msg, ModifierKeys modifiers)
   w System.Windows.Interop.HwndSource.OnPreprocessMessage(Object param)
   w System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   w System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
-System.InvalidOperationException: A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object. This is a non-recoverable error.
-   w System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.HandleRefreshedValue(MergeOption mergeOption, IList`1 refreshedValue)
   w System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.Load(MergeOption mergeOption)
   w InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.LoadRelatedEnd(RelatedEnd end)
   w InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.LoadEntityReference[T](EntityReference`1 reference)
   w InsERT.Moria.ModelDanych.JednostkaMiaryAsortymentu.get_PodstawowyKodKreskowy()

 

Edytowane przez Łukasz W.
Link to postu

Czy to może generować się przez niedodanie warunku IsInRecycleBin=0 ? Jeśli tak, to jak taki warunek umieścić?

Użyłem również linijki:

SET ANSI_WARNINGS  OFF;

gdyż inaczej generował się błąd:

Cytat

String or binary data would be truncated.

Oczywiście zrobiłem kopię zapasową więc aktualnie wszystko wróciło do normy.

Link to postu

Wg mnie pododawał Pan podstawowe kody kreskowe tam gdzie juz były podstawowe kody kreskowe. Świadczy o tym ta część:

Cytat

  w System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
-System.InvalidOperationException: A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object. This is a non-recoverable error.
-   w System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.HandleRefreshedValue(MergeOption mergeOption, IList`1 refreshedValue)
   w System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.Load(MergeOption mergeOption)
   w InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.LoadRelatedEnd(RelatedEnd end)
   w InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.LoadEntityReference[T](EntityReference`1 reference)
   w InsERT.Moria.ModelDanych.JednostkaMiaryAsortymentu.get_PodstawowyKodKreskowy()

O tym, że kod jest podstawowy, tak jak pisałem, świadczy JednostkaMiaryAsortymentuZKodemPodstawowym_Id NOT NULL, a więc jeśli już jest kod kreskowy podstawowy, powinien Pan wstawiać rekordy z JednostkaMiaryAsortymentuZKodemPodstawowym_Id = NULL.

Link to postu

Czyli tam, gdzie są już ustawione kody kreskowe nie mogę nadpisać tego nowymi? Trzeba to zrobić przez UPDATE? Wyzerować wszystkie kody i wpisać je od nowa?

Tak jak pisałem we wszystkich asortymentach ma być tylko jeden kod kreskowy, więc jest on oczywiście podstawowym.

Czyli po prostu dodały się nowe, niepotrzebne, powtórzone rekordy przy pozycjach, które miały już kod?

Link to postu

Nie ma prostej, uniwersalnej odpowiedzi. Natomiast w sytuacji gdy nie ma Pan żadnych kodów kreskowych i chce Pan dodać wszystkim towarom to powinno być ok, tak samo jeśli Pan już dodał i to są tylko te kody, które Pan chce zastąpić symbolem to wystarczy UPDATE. Program natomiast pokazał, że gdzieś jest więcej kodów podstawowych. 

Nie wiem jak jest u Pana z jednostkami, ale te kody należy dodać/zaktualizować tylko w jednostce podstawowej danego towaru.

Link to postu

Wymyśliłem coś takiego: najpierw kasuję całą tabele KodyKreskowe, a potem ją przepisuję z symbolu:

DELETE FROM ModelDanychContainer.KodyKreskowe;
SET ANSI_WARNINGS  OFF;
INSERT INTO ModelDanychContainer.KodyKreskowe (Kod, JednostkaMiaryAsortymentu_Id, JednostkaMiaryAsortymentuZKodemPodstawowym_Id)
SELECT 
    Asortymenty.Symbol
    ,JednostkiMiarAsortymentow.Id
    ,JednostkiMiarAsortymentow.Id

	
	
FROM 
    Modeldanychcontainer.Asortymenty
    INNER JOIN Modeldanychcontainer.JednostkiMiarAsortymentow ON JednostkiMiarAsortymentow.Asortyment_Id=Asortymenty.Id
	full join ModelDanychContainer.KodyKreskowe on KodyKreskowe.JednostkaMiaryAsortymentu_Id=JednostkiMiarAsortymentow.Id
	WHERE Asortymenty.IsInRecycleBin=0

Czy myśli Pan, że będzie to ok? Na razie nie generuje żadnych błędów i wydaje się żeby chodziło tak jak powinno

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