Re: Дочерние объекты TCSApp

Как через делфи освобождать память объектов
TCSApp.DeleteModuleByUserModuleName не работает, пишет Undeclared idetifier

Re: Дочерние объекты TCSApp

код

Re: Дочерние объекты TCSApp

var
  TCSobj: ITCS;
  TCSapp: ITCS_Application;
  NMK: OleVariant;
  NMK_par: OleVariant;

begin
    CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
    TCSobj := CreateOLEObject('CSDN.TCS') as ITCS;
    TCSapp := TCSobj.LoginEx('*', '*');

    NMK := TCSapp.Nomenclatures[5];
    NMK.UserModuleName := NMK.UniqueUserModuleName;

    NMK.Filter.ClearFilter;
    NMK.Filter.NewFilterItem(NMK.Properties['NAME'], fkSTARTING, 'Ротор');
    NMK.Filter.ApplyFilter;

    NMK.First;
    while not NMK.EOF do begin
        MemDataSet.Append;

        NMK_par := NMK.Properties['Parameters'].AsIDispatch;

        if (not NMK_par.IsEmpty) then begin
           If NMK_par.Locate[NMK_par.Properties['PAR_CODE'], 'RS_NMK_DS2', 0] Then
              *******
        NMK.Next;
    end;

    NMK_par:=null;
    
    TCSapp.DeleteModuleByUserModuleName(NMK.UserModuleName);

    TCSapp := nil;
    TCSobj := nil;
    CoUninitialize;
end;

Delphi  не  хочет компилировать следующую строку:   TCSapp.DeleteModuleByUserModuleName(NMK.UserModuleName);

И корректно ли писать так   NMK_par:=null; ?

Re: Дочерние объекты TCSApp

VAshot писал(а):
Delphi  не  хочет компилировать следующую строку:   TCSapp.DeleteModuleByUserModuleName(NMK.UserModuleName);

и правильно, что не хочет

(TCSApp as CSDN_TLB.IOcs_Application2).DeleteModuleByUserModuleName((NMK as IModule2).UserModuleName);

p.s. Вы не злоупотребляли бы OleVariant'ами

Re: Дочерние объекты TCSApp

 (TCSApp as CSDN_TLB.IOcs_Application2).DeleteModuleByUserModuleName((NMK as IModule2).UserModuleName);

Ошибка

[Pascal Error] main.pas(142): E2015 Operator not applicable to this operand type

курсор за "(NMK as IModule2)".



Сергей писал(а):
p.s. Вы не злоупотребляли бы OleVariant'ами

А какие типы в данном случае применимы?

Это мой первый опыт работы с Ole и TechnologiCS, который этим и ограничится, выборкой небольшого набора данных во внешнюю БД.

Re: Дочерние объекты TCSApp

VAshot писал(а):
А какие типы в данном случае применимы?


NMK: CSDN_TLB.Nomenclatures;
NMK_par: CSDN_TLB.NmkParameters;

при таком объявлении должно работать...только в строчке

NMK.UserModuleName := NMK.UniqueUserModuleName;

тоже надо через IModule2 делать

Re: Дочерние объекты TCSApp

Вот так?

 (NMK as IModule2).UserModuleName := (NMK as IModule2).UniqueUserModuleName;

тут работает, но начинает ругаться на методы и свойства Filter.
Тут видимо нужно как-то так делать? Я прав?

    Dim Filter As CSDN.Filter
    Dim FilterItem As CSDN.FilterItem
   
    
    Filter = App.Users.Filter
    
    For I = 0 To Filter.Count - 1
        Filter.Items(I).Active = False
    Next I

    FilterItem = Filter.Add(App.Users.Properties("NAME"))
    FilterItem.FilterKind = fkSTARTING
    FilterItem.Condition = "lflflflf"
    
    FilterItem.Active = True
    Filter.Active = True

Ну его пока закоментарили, начал ругаться на

NMK_par := NMK.Properties['Parameters'].AsIDispatch

[Pascal Error] main.pas(108): E2010 Incompatible types: 'INmkParameters' and 'IDispatch'

:(

ломаю голову, почему обращение к одному и тому же Ole объекту в VB Excel и Delphi так отличается.

Re: Дочерние объекты TCSApp

1.ну да...как-то так smile
2.

[Pascal Error] main.pas(108): E2010 Incompatible types: 'INmkParameters' and 'IDispatch'

если по-русски, то "несовпадение типов", т.е. типы надо приводить:

NMK_par := NMK.Properties['PARAMETERS'].AsIDispatch as INmkParameters;

можно ещё посмотреть IParameterValues
3.

ломаю голову, почему обращение к одному и тому же Ole объекту в VB Excel и Delphi так отличается.

в vba активно используются "универсальные" переменные variant + неявное приведение типов, а в Delphi такие вольности не допускаются

Re: Дочерние объекты TCSApp

Ага, спасиб, дошел сам до

NMK_par := NMK.Properties['Parameters'].AsIDispatch as INmkParameters;

Методом и научного и тыка :)

А освобождать так:

NMK_par:=nil;

?

Вот такой фильтр работает, так корректно?

    (NMK.Filter as IFilter2).ClearFilter;
    (NMK.Filter as IFilter2).NewFilterItem(NMK.Properties['NAME'], fkSTARTING, 'Ротор');
    (NMK.Filter as IFilter2).ApplyFilter;

Re: Дочерние объекты TCSApp

Методом и научного и тыка

есть ещё метод хелпа и поиска по форуму)

Вот такой фильтр работает, так корректно?

ну если работает - значит корректно...с точки зрения компилятора smile

А освобождать так?

так.
з.ы. может проще всётаки на VB?

Re: Дочерние объекты TCSApp

Из VB сложнее потом подцепиться к FireBird и синхронизировать несколько табличек. По крайней мере, для меня.

P.S. Как же я мечтаю о событиях в TechnologiCS, хотя бы на добавление записи.

Re: Дочерние объекты TCSApp

Не подскажите, а как достучаться до

Set Ost_NMK = TCSApp.Inventory.NomenclaturesBalance(i)

?

Re: Дочерние объекты TCSApp

(TCSApp as ITcs_Application2).Inventory.NomenclaturesBalance

Re: Дочерние объекты TCSApp

И, надеюсь, последний вопросик, как получить это?

Set Ser = Ost_NMK.Properties("NomenclatureSerialNumber").AsIDispatch

по аналогии не прокатывает

 ost_NMK_sn := ost_NMK.Properties['NomenclatureSerialNumber'].AsIDispatch as INmkParameters;

Сообщение при выполнении программы: Интерфейс не поддерживается.

Re: Дочерние объекты TCSApp

VAshot писал(а):
по аналогии не прокатывает

странная аналогия...
почему не INomenclatureSerialNumbers?
можно IPModule, IDModule