Re: Как добавить учетную карточку?
вот на этой строчке
BalanceNmkCards.ClassificatorID:= 92;
несоответствие типов? точно? текст ошибки
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
TechnologiCS → TechnologiCS → Использование TechnologiCS API → Как добавить учетную карточку?
вот на этой строчке
BalanceNmkCards.ClassificatorID:= 92;
несоответствие типов? точно? текст ошибки
С несоответствием типов я может погорячился...
Текст ошибки:
Project ... raised exception class EMSError with message Syntax error converting the varchar value sa to a column of data type int. Exception. Нужно задать классификатор <KeyErr>. Process stopped...
AlexB писал(а):
С несоответствием типов я может погорячился...
Текст ошибки:Project ... raised exception class EMSError with message Syntax error converting the varchar value sa to a column of data type int. Exception. Нужно задать классификатор <KeyErr>. Process stopped...
это означает, что ClassificatorID =92 не существует!
А как можно получить ID классификатора, зная ID цеха?
Никак.
Для чего Вам нужно знать идентификатор классификатора номенклатуры, которой нет в списке?
TechnologiCS Help писал(а):
IBalanceNmkCards.ClassificatorID (PropertyGet)
Возвращает: идентификатор классификатора учетной карточки, если в текущем цехе/участке в списке номенклатуры нет текущей номенклатуры, то -1
В общем и целом мне нужно добавить карточку к номенклатуре, исходя из примера в справке я делаю тоже самое в Delphi. Пример:
Sub Test() Dim NMks Dim NMkId Dim DepartmentID Dim BalanceNmkCards Dim I Dim CardClassificator Dim CardClassificatorID Dim Number, Comment, Price, NmkPartID, SerialNumberID, ShowDialog, DialogCaption If TCSApp.NmkClasses.RunModuleForSelect("Выберите класс", False) Then Set NMks = TCSApp.Nomenclatures(TCSApp.NmkClasses.Properties("ID").AsInteger) If NMks.RunModuleForSelect("Выберите номенклатуру", False) Then NMkId = NMks.Properties("ID").AsInteger If TCSApp.PlantDepartments.RunModuleForSelect("Выберите цех/участок", False) Then DepartmentID = TCSApp.PlantDepartments.Properties("ID").AsInteger Set BalanceNmkCards = TCSApp.Inventory.BalanceNmkCards( DepartmentID, NMkId ) BalanceNmkCards.Refresh If BalanceNmkCards.ClassificatorID = -1 Then 'если у цеха нет такой номенклатуры Set CardClassificator = TCSApp.Inventory.BalanceNmkCardClassificator( DepartmentID ) If CardClassificator.ShowModal("Выберите классификатор") = 1 Then BalanceNmkCards.ClassificatorID = CardClassificator.DbTree.Selected.NodeId Else Exit Sub End If Set CardClassificator = Nothing End If Number = "" Comment = "" Price = 0 NmkPartID = -1 SerialNumberID = -1 ShowDialog = 0 DialogCaption = "" DateOpening = Date() I = BalanceNmkCards.AddNmkCard( Number, Comment, Price, NmkPartID, SerialNumberID, ShowDialog, DialogCaption, DateOpening ) I = BalanceNmkCards.ShowModal("Учетные карточки") Set BalanceNmkCards = Nothing End If End If End If End Sub
Все замечательно, я переписал код, но мне нужно, чтобы классификатор выбирался без участия пользователя, т.е. примерно так:
BalanceNmkCards.ClassificatorID = Число
Вот и хочется узнать: как получить это самое Число исходя из ID цеха. Надеюсь Вы меня поняли.
В данном случае классификатор представляет из себя дерево для фильтрации (как в номенклатурном справочнике), которое не зависит от содержания грида.
Я складываю новые карточки в голову дерева:
Set ICardClassificator = TCSapp.Inventory.BalanceNmkCardClassificator(DepartmentID) BalanceNmkCards.ClassificatorID = ICardClassificator.DbTree.RootNodes.Item(0).NodeId
Либо самостоятельно создавайте новую веточку дерева и туда складывайте.
Вот это и было нужно, спасибо.
Еще пару вопросов, не связанных с темой:
1. У меня в Delphi почему то время от времени вываливается вот такая ошибка:
Project ... raised exception class EOutOfMemory with message 'Out of memory'. Process stopped. Use Step or Run to continue.
На строчке:
if Login then ...
Функция Login выглядит вот так:
function Login(): Boolean; begin CoInitializeEx(nil, COINIT_APARTMENTTHREADED); try TCS:= CreateOLEObject('CSDN.TCS') as ITCS; if Assigned(TCS) then App:= TCS.LoginEx('name', 'passwd'); except on E: Exception do begin MessageDlg('Не могу соеденится с ТКС', mtError, [mbOk], 0); frmMain.Close; end; end; Result:= True; end;
Не пойму почему она появляется, причем не только в этом проекте. Может сталкивались с таким?
2. Если заменить строчку
App:= TCS.LoginEx('name', 'passwd');
на
App:= TCS.LoginCurrent;
Запустить ТКС и потом программу то появляется вот такая ошибка:
Project ... raised exception class ENipCouldNotBindSocket with message 'Could not bind socket. Address and port are alredy in use.'
Может и такое было или я что то не то делаю?
CoInitialize(nil);
не помогает :(
AlexB писал(а):
CoInitialize(nil);не помогает :(
не используйте многопоточность совсем
С
App:= TCS.LoginCurrent;
что то не получается.
AlexB писал(а):
СApp:= TCS.LoginCurrent;что то не получается.
т.е. Вы хотите сказать, что в API не работает LoginCurrent?
Нет, в скомпилированном проекте все работает, а когда запускаешь из Delphi появляется ошибка. Вот и хотел спросить, может кто сталкивался с такой проблемой. Просто когда пишешь программу, при отладке удобнее запускать ее из делфи и присоединяться к текущему сеансу.
сталкивался :( но не придумал как её победить
Ясно, спасибо всем ответившим, тему в принципе можно закрывать.
а Вы не пробовали ли "продолжить" после появления ошибки?
Пробовал, если нажать OK, пару раз F8, после перехода в редактор. После этого ошибка "проглатывается" и выполнение идет дальше.
AlexB писал(а):
пару раз F8
можно 1 раз ф9
соответственно при должном желании можно автоматизировать этот процесс...но это к "использованию ТКС АПИ" отношения не имеет...
кстати, есть в дэлфЕ Debugger Options - там можно галочку снять и ошибка эта Вас больше не побеспокоит...
но так не интересно
Вы имеете ввиду галочку Stop on Delphi Exceptions?
TechnologiCS → TechnologiCS → Использование TechnologiCS API → Как добавить учетную карточку?