Для начала немного истории.


Я на личном опыте убедился, как сложно бывает написать программу с непосредственным обращением к системным ресурсам компьютера на языке высокого уровня, таком как Clarion.


Представьте: вам - программисту на Clarion с солидным опытом решения учетных задач типа "склад", "реализация" и т.п. - нужно автоматизировать учет товаров в отделе фасовки. Для этого необходимо получать информацию о весе упаковки с электронных весов. Весы подключены к последовательному интерфейсу компьютера. Протокол получения данных известен. (Бывает, что и этого не знаешь. Это хуже…) Какой способ доступа к порту выбрать? Многие предпочтут стандартный MSComm Control или любой другой ActiveX, которых в интернете полно на любой вкус. "Продвинутые" разработчики напишут интерфейс на WinApi. Это просто, если знаешь, что где лежит в куче удобств под названием Windows. Но что делать человеку, которому даже страшно смотреть на формат вызова CreateFile (С++), да еще когда для нормальной работы порта требуется заполнить несколько структур и запустить поток, а ко всему прочему необходимо установить событие по приему данных так, чтобы своевременно выгребать их из буфера порта, иначе вы их попросту потеряете?..


Конечно, ActiveX (MSComm) облегчает взаимодействие с последовательным портом. Но за простоту использования приходится платить ограниченными возможностями по управлению портом. Да еще перед установкой вашей программы необходимо проверять наличие ActiveX в системе и, если его там нет, - инсталлировать. Проблемка еще та, поверьте.

 

Вот еще пример, когда мой любимый (никакой иронии!) Clarion, мягко говоря, зашел в тупик. Имеется система учета, выполненная в лучших традициях клиент-серверной технологии. У клиента - "голые" картинки, вся "математика" - на сервере во встроенных процедурах, триггерах и т.п. Аналитический отдел почти каждый день требует выборки, и условия все сложнее.


"Что может быть проще?" - скажут кларионисты. Берешь любой акселератор, хотя бы ODBC, встроенный SQL - и дело в шляпе! Но не спешите с выводами. Если вам известна структура таблиц, то проблем действительно нет. А вот если неизвестна…

Можно импортировать структуру данных с сервера. Но это дело хлопотное и не всегда удачное. Вы пробовали импортировать таблицу, в которой есть поля типа VARCHAR? И не пытайтесь. Clarion просто "не понимает", как поле может изменять длину. Что самое обидное, импорт проходит нормально. Clarion ставит "родное" соответствие CSTRING и… все. Когда браузер (просмотр записей в Clarion) пытается показать записи из такой таблицы, он просто "виснет".


Что остается? То, к чему прибегают, когда почти все средства исчерпаны, - встроенный SQL. Мощное средство, хотя и тут возникает множество проблем. Для доступа к данным вы описываете таблицу, в структуре записи которой - всего одно поле "километровой" длины. После того как вы сформируете простой запрос типа


--------------------------------------------------------------------------------
MyFile = 'select * from MyTable'
--------------------------------------------------------------------------------
еще предстоит разобрать строку ответа. Заметьте, что о типе данных вы не будете иметь ни малейшего представления. Но это еще не все. После такой "просьбы":
--------------------------------------------------------------------------------
MyFile = 'SELECT * FROM MyTable ORDER BY Column1 DESC'
--------------------------------------------------------------------------------
встроенный SQL вернет вам то, что сам пожелает (по крайней мере, на ORDER BY Column1 DESC даже не рассчитывайте). В документации так прямо и написано, хотя этот факт немного обескураживает. Можно применить для доступа к "неописанным" (словарем Clarion) структурам данных технологию DAO (Data Access Object). Но вас ожидают те же проблемы, что и при использовании любого ActiveX. О том, как будет происходить сам процесс выборки данных, приходится только догадываться. (Сколько патчей Microsoft выпустил к каждому своему продукту, и сколько их еще будет…) С проблемами, описанными в этих примерах, еще можно мириться. Но что прикажете делать, если необходимо связать два "клиента" напрямую по TCP/IP (создать сокет и установить на него "прослушку", чтобы "ловить" подключения)? Да простят меня почитатели, но организовать такое только средствами языка, не прибегая к дополнительным библиотекам, невозможно. В свое время я использовал "SocketTools" Standard Edition v2.1 фирмы Catalyst. Там есть все, начиная от простого сокета и заканчивая протоколами SMTP, POP, FTP, Telnet в очень удобной упаковке. Вероятно, у разработчиков Clarion было нечто подобное в мыслях. Появились шаблоны, которые позволяют очень легко отправить e-mail, но, как ни странно, не позволяют получить ответ на него. Наглядное подтверждение этому - переписка кларионистов. Коллеги! Не стоит отчаиваться. Нам на помощь придет Java. Но не в том амплуа, в котором мы привыкли видеть этот язык. Считается, и по праву, что язык Java предназначен для веб-приложений. Согласен. Но не совсем. Java намного интереснее и мощнее, и может иметь больше применений, чем те, что находят ему веб-дизайнеры. Объясню ход своих рассуждений. В первой главе самого хорошего, на мой взгляд, учебника по Java (Д. Вебер, "Технология Java в подлиннике", СПб BHW-Петербург, 2001) Джо Вебер указывает на четыре типа Java-приложений: аплеты, GUI-приложения, приложения командной строки и пакеты. В частности, о пакетах автор говорит следующее: "…это не приложения в чистом виде, а набор классов (переносимых байт-кодированных файлов Java), содержащихся в одном пакете (package), напоминающем библиотеку классов С++." И дальше: "Отсутствует пользовательский формат для пакетов, подобный тем форматам, которые используются со статическими и динамическими библиотеками в различных операционных системах". Вот с последним Вашим утверждением, дорогой автор, позвольте поспорить. Да, действительно, использовать пакеты в приложениях на Clarion напрямую нельзя, но… Предлагаю вам технологию, которую я с успехом использовал для решения задачи, описанной во втором примере (рисунок). Приведенный в Листинге 1 код Java компилировался в dll в среде MS J++ Pro 6.0. Следующий участок кода позволял зарегистрировать мой класс в библиотеке классов Windows.
--------------------------------------------------------------------------------
* @com.register ( clsid=05A9C567-66FB-49C4-A47F-9228C216493A, typelib=3AA5F5E8-66AC-4FD7-8B36-B9E8BA1516B3 )
--------------------------------------------------------------------------------
Вот, собственно, и все. По сути, вы получили доступ к очень мощному, и самое главное гибкому средству доступа к данным, которое, увы, пока недоступно в Clarion. Поверьте на слово, мост JDBC-ODBC очень гибок. Он позволяет заглянуть в самое "нутро" процесса, ведь код классов Java открыт! Вы удивитесь, как просто оказалось использовать этот класс в Clarion (Листинг 2). Спешу заметить, что компания Microsoft выпустила бета-версию драйверов JDBC к SQL Server 2000. Пока это, конечно, бета, но работает нормально. С помощью приведенного в этой статье кода я получил доступ к данным, хранящимся в форматах TopSpeed (причем к мультитабличному файлу), MS SQL 2000, Access 2000, Excel 2000, текстовом (с любым разделителем). И только после нескольких недель тестирования я наконец поверил в то, что ODBC - это действительно Open Database Connectivity (открытый интерфейс баз данных). Вот уж воистину ОТКРЫТЫЙ! ODBC с его абстрактной моделью в некоторых случаях бывает предпочтительнее строгой определенности Clarion. Не верите - попробуйте сами. Все, что было сказано выше о легкости, с которой маленький по размеру (но не по возможностям) код на Java может решать большие проблемы, справедливо и в отношении примера, с которого я начал эту статью.

 

 

Иллюстрация:  Рисунок. Пример работы приложения на Clarion с использованием Java-класса для доступа к данным Вместо послесловия Позволю себе остановиться только на аргументах "за". "Против" будет кому высказать.

  1. Бесплатно. Виртуальная машина Java и средства разработки вам ничего не будут стоить. Для нас это подчас является самым главным аргументом.
  2. Java распространяется с исходными текстами классов.
  3. Передача параметров между Java-классом и приложением на Clarion определена COM-интерфейсом (просто и со вкусом).
  4. Java-код работает на любой платформе, на которой есть виртуальная Java-машина.
  5. Когда вы создаете объект Java-класса, для его выполнения загружается виртуальная машина Java (другими словами, создается среда, отличная от той, в которой выполняется Clarion-приложение). Что нельзя сказать о статических и динамических библиотеках, написанных на других языках программирования, которые вы линкуете к своему приложению и тем самым ограничиваете их возможности средой Clarion.

Это неполный список тех "вкусностей", которые может дать разработчику на Clarion предлагаемая мной технология. Замечу, что сам я являюсь программистом с 9-летним стажем использования Clarion в своих разработках, и за это время успел "пощупать" несколько языков, но привлекательней, чем "клаша", не нашел. Clarion - это не только язык. Это мощная и в тоже время дружественная среда разработки, отлично документированная (оригинальный вариант) с прекрасной контекстной справкой. Чего не скажешь о документации VisualStudio с ее MSDN… Как по мне, так проще в интернет "сходить". Наконец, Clarion формирует если не стиль мышления, то стиль программирования. И мне кажется, что от использования "гибрида" Clarion-Java оба языка только выиграют. Впрочем, о пригодности такого объединения для ваших задач судить вам. За себя могу сказать одно: то, чего мне не хватало в Clarion, я с избытком получил от Java, и при этом не пришлось переписывать отлаженные проекты (а только немного сократить и избавить от "чуждых" среде Clarion библиотек). 

 

 Листинг 1


* @com.register (clsid=05A9C567-66FB-49C4-A47F-9228C216493A, typelib=3AA5F5E8-66AC-4FD7-8B36-B9E8BA1516B3)


public class KJava{
 public Connection conn=null;
 public PreparedStatement st=null;
 public ResultSet rs=null;
 public ResultSetMetaData rsmt=null;
 public int cc = 0;

 public void Start(String ODBCSource, String User, String Pass) throws SQLException{
  try{
   Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver");
   conn = DriverManager.getConnection("jdbc:odbc:"+ODBCSource,User,Pass);
  }catch(ClassNotFoundException ex){System.out.println("ClassNotFound "+ex);}
 }
 public void Query(String QueryStr) throws SQLException{
  st = conn.prepareStatement(QueryStr);
  rs = st.executeQuery();
  rsmt = rs.getMetaData();
  cc = rsmt.getColumnCount();
 }
 public String Next() throws SQLException{
  String TempStr = new String();
  if (rs.next()){
   TempStr = "есть";
  }else{
   TempStr = "нет";
  } 
  return TempStr;
 }
 public String GetCol(int Ind) throws SQLException{
  return rs.getString(Ind).trim();
 }
 public String ColumnName(int Ind) throws SQLException{
  return rsmt.getColumnLabel(Ind);
 }
 public String ColumnType(int Ind) throws SQLException{
  return rsmt.getColumnTypeName(Ind);
 }
 public int ColumnScale(int Ind) throws SQLException{
  return rsmt.getScale(Ind);
 }
 public int ColumnPrecision(int Ind) throws SQLException{
  return rsmt.getPrecision(Ind);
 }
}

 

Листинг 2


!Создаем запрос и читаем структуру данных
! ODBCSource - название любого(!!!) источника данных
!UserName и Pass - имя пользователя и пароль доступа к данным соответственно
! QueryStr - ПОЛНОЦЕННЫЙ запрос на SQL.

!создаем объект, подключаем источник, передаем запрос, читаем структуру данных
!с ТИПАМИ И РАЗМЕРНОСТЬЮ ПОЛЕЙ И НИКАКИХ ОГРАНИЧЕНИЙ.
!по крайней мере VARCHAR читаем такого размера, который хранится в таблице
 free(Result)
 ?JavaBase = 'KJava.KJava'
 ?JavaBase = 0
 ?JavaBase
 ?JavaBase
 window = 'кол-во столбцов = '&?JavaBase
 free(ColumnProp)
 loop i# = 1 to ?JavaBase
  cp:NameCol = ?JavaBase
 cp:TypeCol = ?JavaBase
 cp:ScaleCol = ?JavaBase
 cp:PrecisionCol = ?JavaBase
 add(ColumnProp); select(?List2,i#)
 end

!теперь, когда запрос выполнен, можно забирать данные
 TimeStart = clock()
 loop until ?JavaBase = 'нет'
    loop i# = 1 to ?JavaBase
      f1 = clip(f1)&?JavaBase&'|'
    end
    add(Result); display; clear(Result)
 end
 TimeStop = clock()
 window = 'время выполнения '&format(TimeStop-TimeStart,@t4)

2004.04.15
19.03.2009
В IV квартале 2008 г. украинский рынок серверов по сравнению с аналогичным периодом прошлого года сократился в денежном выражении на 34% – до $30 млн (в ценах для конечных пользователей), а за весь календарный год – более чем на 5%, до 132 млн долл.


12.03.2009
4 марта в Киеве компания Telco провела конференцию "Инновационные телекоммуникации", посвященную новым эффективным телекоммуникационным технологиям для решения задач современного бизнеса.


05.03.2009
25 февраля в Киеве компания IBM, при информационной поддержке "1С" и Canonical, провела конференцию "Как сохранить деньги в условиях кризиса?"


26.02.2009
18-19 февраля в Киеве прошел юбилейный съезд ИТ-директоров Украины. Участниками данного мероприятия стали ИТ-директора, ИТ-менеджеры, поставщики ИТ-решений из Киева, Николаева, Днепропетровска, Чернигова и других городов Украины...


19.02.2009
10 февраля в Киеве состоялась пресс-конференция, посвященная итогам деятельности компании "DiaWest – Комп’ютерний світ" в 2008 году.


12.02.2009
С 5 февраля 2009 г. в Киеве начали работу учебные курсы по использованию услуг "электронного предприятия/ учреждения" на базе сети информационно-маркетинговых центров (ИМЦ).


04.02.2009
29 января 2009 года в редакции еженедельника "Computer World/Украина" состоялось награждение победителей акции "Оформи подписку – получи приз!".


29.01.2009
22 января в Киеве компания "МУК" и представительство компании Cisco в Украине провели семинар для партнеров "Обзор продуктов и решений Cisco Small Business"

 

 
 
Copyright © 1997-2008 ИД "Комиздат".