Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Помогите найти пример работы с ТП и прямыми запросами (число прочтений - 5128 )
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Помогите найти пример работы с ТП и прямыми запросами
15. Ноября 2008 :: 10:30
Печать  
Извините, что отнимаю ваше время, потому что, наверное, ответ на мой вопрос есть где-то на форуме.
Тем не менее.

У меня есть две задачи:

1. Использовать ТабличноеПоле во внешнем отчете для запроса к моей ДБФ базе, допустим, к справочнику "Контрагенты". Мне это нужно, чтобы фильтровать и показывать пользователю только отдельные элементы справочника.
Правильно ли я понимаю, что:
а. Нужен драйвер ODBC FoxPro
б. Это не будет работать в монопольном режиме
в. Производительность будет не ниже чем у стандартных справочников. Т.е., например, при скроллинге новые элементы будут автоматически запрашиваться
г. Здесь (http://www.1cpp.ru/forum/YaBB.pl?num=1155187084/0) есть пример. Но я задолбался его запускать ("Создание элемента управления MSComctlLib.TreeCtrl не удалось")
Может у кого-нить есть обработка попроще с примером использования ТП и прямых запросов?

2. Хочу использовать ТП для обращения к MySQL. Есть пример?

Спасибо
  
Наверх
 
IP записан
 
Burlak
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 65
Зарегистрирован: 28. Апреля 2008
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #1 - 15. Ноября 2008 :: 16:40
Печать  
Так работает:
===============
Где-то в глобальном модуле:
. . .
/////////////////// Работаем с VFP OLEDB Provider /////////////////
Перем Соединение;
Перем cmdOLEDB  Экспорт;
Перем mdw           Экспорт;   //-- Работаем с MetaDataWork
. . .
Процедура ПриНачалеРаботыСистемы()
. . .
//пытаемся загрузить компоненту в формате штатной ВК
  Если ЗагрузитьВнешнююКомпоненту("1cpp.dll") = 0 Тогда
    Предупреждение("Неудачная попытка загрузить 1cpp.dll");
    СтатусВозврата(0);
    //Возврат;
  КонецЕсли;
  Соединение="
    |Provider=VFPOLEDB.1;
//    |Deleted=Yes; 
    |Null = Yes;
    |Exclusive = No;
    |SourceType = DBF;
    |Data Source=" + КаталогИБ() + ";
    |Mode=Share Deny None;
//    |Mode=ReadWrite;
    |Extended Properties="""";
    |User ID="""";
    |Password="""";
    |Mask Password=False;
    |Collating Sequence=MACHINE;
    |DSN=""""";

  //-- Попытка открыть базу данных через OLEDB
  Попытка
     OLEDB=СоздатьОбъект("OLEDBData");
     Рез=OLEDB.Соединение(Соединение);
     cmdOLEDB=OLEDB.СоздатьКоманду();
     cmdOLEDB.Выполнить("SET ANSI OFF");
     mdw=CreateObject("MetaDataWork");
    Исключение
     Предупреждение("Неудачная попытка открыть базу данных через VFP OLFEDB");
//      СтатусВозврата(0);
//      //Возврат;
  КонецПопытки;
. . .
==== Обработка:====
Форма - рисуешь кнопку Номенклатура "кнпНоменклатура"
Модуль:
. . .
Перем итНоменклатура;      //-- Индексированная таблица Номенклатура
Перем тпНоменклатура;      //-- Табличное поле Номенклатура
. . .

Процедура ПослеОткрытия()
. . .
  итНоменклатура=СоздатьОбъект("ИндексированнаяТаблица");
  оиНоменклатураИТ = СоздатьОбъект("VTExtProvider");
  //-- Создадим необходимые табличные поля
  оФорма = СоздатьОбъект("Форма");
  оФорма.УстановитьФорму(Форма);
   тпНоменклатура = оФорма.СоздатьЭлементУправления("ТабличноеПоле", "кнпНоменклатура");

  глФабрика = СоздатьОбъект("ФабрикаОбъектов");
  ШрифтАриал10Жирный = глФабрика.Шрифт("Arial", 10, 1);

  //==================================================
  //-- Построим колонки в табличном поле Номенклатура
  //==================================================
  ИмяКолонки="Номенклатура";
  Колонка                   = тпНоменклатура.Колонки.Добавить(ИмяКолонки);
  Колонка.Заголовок         = ИмяКолонки;
  Колонка.ШрифтЗаголовка    = ШрифтАриал10Жирный;
  Колонка.Данные            = ИмяКолонки; //-- Колонка таблицы значений
  Колонка.ИзменятьВидимость = 0;
  тпНоменклатура.VScroller=1;

  //-- Подключим индексную таблицу к табличному полю
  оиНоменклатураИТ.ИндексированнаяТаблица=итНоменклатура;
  тпНоменклатура.ПоставщикДанных       = оиНоменклатураИТ;
  тпНоменклатура.ТаймаутБыстрогоПоиска = 100;
. . .
КонецПроцедуры
. . .

//******* Обработка нажатия кнопки ВыборНоменклатуры ********
Процедура кнпВыборНоменклатуры()
   итНоменклатура.УдалитьСтроки();

////************************************************
//  //-- Тест скорострельности
//  ВремяНачалоЗапроса=_GetPerformanceCounter();
////************************************************

  //-- Построим таблицу значений для выбора номенклатуры
  Select = "
    |SELECT DISTINCT
    |  Номенклатура.Id as Код,
    |  Номенклатура.Descr as Номенклатура";
  From = "
    | FROM FORCE
    |  $ДокументСтроки.ЗаказНаВыпуск as t_ЗаказНаВыпуск,
    |  1SJourn as Жур,
    |  $Справочник.Номенклатура as Номенклатура";
   Where = "
    | WHERE
    |  t_ЗаказНаВыпуск.IDDoc = Жур.IDDoc AND
    |  Жур.Date BETWEEN :НачДата~~ AND :КонДата~~  AND
    |  Номенклатура.Id=$t_ЗаказНаВыпуск.Номенклатура";

//  From = "
//    | FROM FORCE
//    |  1SJourn as Жур
//    |  INNER JOIN
//    |   $ДокументСтроки.ЗаказНаВыпуск as t_ЗаказНаВыпуск
//    |  ON
//    |   BETWEEN(
//    |    Жур.IDDOCDEF+DTOS(Жур.date)+Жур.time+Жур.iddoc,
//    |    $ВидДокумента.ЗаказНаВыпуск+DTOS(:НачДата~~)+'               ',
//    |    $ВидДокумента.ЗаказНаВыпуск+DTOS(:КонДата~~)+'ZZZZZZZZZZZZZZZ'
//    |   ) AND
//    |    t_ЗаказНаВыпуск.IDDoc = Жур.IDDoc
//    |    INNER JOIN
//    |     $Справочник.Номенклатура as Номенклатура
//    |    ON
//    |     Номенклатура.Id=$t_ЗаказНаВыпуск.Номенклатура";
//   Where = "";

  //-- Текстовый фрагмент идентификатора номенклатуры определён ?
  пвНоменклатура=СокрЛП(пвНоменклатура);
  Если  пвНоменклатура<>"" Тогда
    where=where+" AND UPPER(Номенклатура.Descr) LIKE """+ Врег(пвНоменклатура)+"%""";
  КонецЕсли;

ТекстЗапроса =select+from+where+" ORDER BY Номенклатура";
  Попытка
    cmdOLEDB.УстановитьТекстовыйПараметр("НачДата", НачДата);
    cmdOLEDB.УстановитьТекстовыйПараметр("КонДата", КонДата);
    cmdOLEDB.ВыполнитьИнструкцию(ТекстЗапроса,итНоменклатура);
  Исключение
    Предупреждение("Ошибка построения таблицы для Выбора номенклатуры");
    Возврат;
  КонецПопытки;
  Если итНоменклатура.КоличествоСтрок()=0 Тогда
    Предупреждение("Ошибка построения таблицы для Выбора номенклатуры*");
    Возврат;
  КонецЕсли;
////***********************************************************
//  //-- Завершение теста скорострельности
//  ВремяКонецЗапроса=_GetPerformanceCounter();
//  ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
//  Сообщить("Формирование длилось "+(ВремяЗапроса/1000)+"с");
////*************************************************************
  тпНоменклатура.StartView=0;
  тпНоменклатура.ОбновитьСтроки();
  тпНоменклатура.ТекущаяСтрока=1;
КонецПроцедуры
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #2 - 15. Ноября 2008 :: 19:29
Печать  
Правильно ли я понимаю, что это вариант с помощью ИТЗ и драйвером OLEDB?
Каковы преимущества использования ИТЗ в этом случае?
Нелзя ли обойтись без ИТЗ, используя драйвер ODBC?
Пример?
  
Наверх
 
IP записан
 
Burlak
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 65
Зарегистрирован: 28. Апреля 2008
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #3 - 16. Ноября 2008 :: 14:21
Печать  
>blindvic
>Правильно ли я понимаю, ...
Правильно.
Это один из вариантов. Я пришёл в мир 1С из мира C# (.Net), там принято работать с локальным DataSet. Какие данные нужны приложению и их объем регулируются запросом (SELECT по хорошему должен иметь TOP) с разумными фильтрами.
Это то, что есть под рукой, могущие сделают больше.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #4 - 16. Ноября 2008 :: 14:43
Печать  
Если речь идет о тысячах элементов, и мне не нужна ТЗ, чтобы проводить с ней манипуляции - то ее применение не оправдано?
Т.е., если в выборке несколько тысяч элементов, то ИТЗ будет жрать память?
Речь идет о привычке? А какие еще причины?

Мне всего лишь нужно дать пользователю доступ как в обычной форме списка справочника, но только отфильтрованным элементов. Мне кажется использование ТЗ неоправданным...
« Последняя редакция: 16. Ноября 2008 :: 20:48 - blindvic »  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #5 - 16. Ноября 2008 :: 20:04
Печать  
Динамического поставщика данных VFP OLEDB для ТП нет. Поэтому люди сразу дёргают все данные.
Для ДБФ есть ещё один вариант - использовать 1sqlite, но там пока(?) не реализована возможность быстрого поиска...  Печаль Но мы надеемся, что Александр Орефков всё-таки добьёт это дело.
  
Наверх
 
IP записан
 
Burlak
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 65
Зарегистрирован: 28. Апреля 2008
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #6 - 17. Ноября 2008 :: 05:21
Печать  
>blindvic
>Если речь идет о тысячах элементов ...
Мой пример не панацея на все случаи жизни и не истина в последней инстанции. Это всего лишь вариант, один из многих, не более. Обыгрываю ситуацию с  кешированием фрагмента выборки на локальном компьютере для его возможно быстрого зрительного анализа, локально сортируя и фильтруя. Для этого и применяю индексированную таблицу. Для заполнения кеша применяю страничную подкачку и/или разумную генерацию первого фильтра. Не встречал ещё клиента, который бы в лоб листал выборку из тысяч строк. Что-то здесь не так. Мой подход описан здесь: http://www.gotdotnet.ru/Forums/Design/488948.aspx
С уважением, Владимир.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #7 - 17. Ноября 2008 :: 07:26
Печать  
Burlak писал(а) 17. Ноября 2008 :: 05:21:
Мой пример не панацея на все случаи жизни и не истина в последней инстанции...

Спасибо за объяснение, я новичок в SQL.

JohnyDeath писал(а) 16. Ноября 2008 :: 20:04:
Динамического поставщика данных VFP OLEDB для ТП нет.

Я в документации читал, что ТП поддерживает поставщики данных торлько ODBC. И драйвер вроде есть у Microsoft.
???
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #8 - 17. Ноября 2008 :: 07:38
Печать  
blindvic писал(а) 17. Ноября 2008 :: 07:26:
JohnyDeath писал(а) 16. Ноября 2008 :: 20:04:
Динамического поставщика данных VFP OLEDB для ТП нет.

Я в документации читал, что ТП поддерживает поставщики данных торлько ODBC. И драйвер вроде есть у Microsoft.
???

ODBC драйвер для ДБФ тормозной и ограниченный. Но может быть тебе для небольших задач пойдёт..
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #9 - 21. Ноября 2008 :: 15:58
Печать  
Ладно, с обращением с ДБФ без ИТЗ ждем пока 1sqlite будет проверена.

А вот связать MySql и ТП не получается - не могу найти простой пример.
Есть база. Хочу, чтобы ТП отобразил выборк - без использования ТЗ.
Начал делать по моему разумению:
Код
Выбрать все
Перем ТП;

//*******************************************
Процедура Сформировать()
	id_server = "localhost";
	id_database = "inf1188";
	id_user = "root";
	id_password = "";


	DataBase = СоздатьОбъект("ODBCDatabase");
	Если DataBase.Соединение("DRIVER={MySQL ODBC 3.51 Driver}; SERVER="+id_server+"; DATABASE="+id_database+"; USER="+id_user+"; PASSWORD="+id_password+"; OPTION=3;") = 0 Тогда
		Сообщить("Неудалось подключиться к базе данных, проверьте наличие драйвера, адрес сервера и наличие связи!!!", "!!!");
		Возврат;
	КонецЕсли;

	рс = СоздатьОбъект("ODBCRecordSet");
	рс.SetDatabase(DataBase);

	тз = рс.ВыполнитьИнструкцию("SELECT * FROM company WHERE CompanyName LIKE '%invest%' LIMIT 10");
	тз.ВыбратьСТроку();


	оПоставщикДанных = СоздатьОбъект("ODBCDataProvider.MySQL");
	оПоставщикДанных.БазаДанных = DataBase;

	рс = 0;
	DataBase.Закрыть();

КонецПроцедуры

*
Процедура ПослеОткрытия()
	_Форма = СоздатьОбъект("Форма");
	_Форма.УстановитьФорму(Форма);
	ТП =_Форма.СоздатьЭлементУправления("ТабличноеПоле", "ТП");
КонецПроцедуры 


Что дальше делать - не знаю...
Помогите, люди добрые  Печаль
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #10 - 21. Ноября 2008 :: 16:09
Печать  
DataBase.Закрыть(); - это лишнее
Цитата:
Что дальше делать - не знаю...

оПоставщикДанных = СоздатьОбъект("ODBCDataProvider.MySQL");
оПоставщикДанных.БазаДанных = DataBase;
оПоставщикДанных.УстТекстЗапроса("...")
оПоставщикДанных.УстКлючПорядка("...")
ТП.ПостащикДанных = оПоставщикДанных;
ТП.ОбновитьСтроки();
  

1&&2&&3
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #11 - 22. Ноября 2008 :: 10:41
Печать  
Вот что у меня пока что получилось:
Код
Выбрать все
Перем ТП, DataBase;

//*******************************************
Процедура Сформировать()

	оПоставщикДанных = СоздатьОбъект("ODBCDataProvider.MySQL");
	оПоставщикДанных.БазаДанных = DataBase;

	оПоставщикДанных.УстТекстЗапроса("SELECT `ID` AS ID, `CompanyName` AS CoName, `StreetID` AS  Street FROM company WHERE CompanyName LIKE '%invest%'");
	оПоставщикДанных.УстКлючПорядка("CoName ASC");
	оПоставщикДанных.УстИдПоле("ID");
	ТП.ПоставщикДанных = оПоставщикДанных;
	ТП.ОбновитьСтроки();

КонецПроцедуры

*
Процедура ПослеОткрытия()
	_Форма = СоздатьОбъект("Форма");
	_Форма.УстановитьФорму(Форма);
	ТП =_Форма.СоздатьЭлементУправления("ТабличноеПоле", "ТП");

	id_server = "localhost";
	id_database = "inf1188";
	id_user = "root";
	id_password = "";

	DataBase = СоздатьОбъект("ODBCDatabase");
	Если DataBase.Соединение("DRIVER={MySQL ODBC 3.51 Driver}; SERVER="+id_server+"; DATABASE="+id_database+"; USER="+id_user+"; PASSWORD="+id_password+"; OPTION=3;") = 0 Тогда
		Сообщить("Неудалось подключиться к базе данных, проверьте наличие драйвера, адрес сервера и наличие связи!!!", "!!!");
		Возврат;
	КонецЕсли;

КонецПроцедуры

*
Процедура ПослеЗакрытия()
	DataBase.Закрыть();
КонецПроцедуры 


На ТП появляется одна колонка без заголовка с пустыми ячейками.
Что делать дальше?
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Помогите найти пример работы с ТП и прямыми запросами
Ответ #12 - 22. Ноября 2008 :: 21:10
Печать  
Разобрался. Добавил после создания ТП:
Код
Выбрать все
	НовКолонка = ТП.Колонки.Добавить("CoName");
	НовКолонка.Данные = "CoName";
	НовКолонка.Заголовок = "Name"; 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать