четверг, 8 декабря 2011 г.

"Рекорд Ярославской области" не навредил репутации Вахрукова у федералов.

 ЕР — 37%, КПРФ — 21%, СР — 18%, ЛДПР — 10%.
Это результаты голосования в Ярославской области. За ЕР у нас проголосовал самый низкий процент среди всех субъектов РФ. Вахрукова - губернатора Ярославской области по идее должны снять, но...
http://top.rbc.ru/politics/08/12/2011/628861.shtml
Здесь мы видим, что о нем и речи не идет. Губернатора Я.О на "ковер к президенту" не вызвали. Что же это: расположение федералов, боязнь обнародовать "рекорд" или признак того, что моя область - какая-то тестовая площадка для мониторинга реальных данных властью, в которой действуют немножко другие правила, нежели в окружающей России?

Реплика товарища Прохорова о событиях на Чистых прудах.

Всем привет!
После Чистых прудов, Триумфальной и внутренних войск в центре Москвы, «Гостинки» в Питере, многочисленных креативных комментариев нашей власти (уж лучше бы не креативили и не комментировали) задумался: а какие могут быть выходы из данной ситуации? Революция? Конечно нет! Я против революций, я хорошо помню, чем в нашей стране и не только в ней, заканчивались все революции для людей
Главное дело власти – обеспечивать соблюдение конституционных прав граждан. Кто во власти отвечает за такую организацию политического процесса и пропаганду, что абсолютно аполитичные люди вышли на площади? Кто так укрепил и разрекламировал по ТВ ЕдРо, что люди в ужасе проголосовали хоть за кого-угодно, но только не за ЕдРо (Москва – город проголосовавший за коммунистов! Фантастика!). Кто вызывает теперь в столицу губернаторов, чтобы отчитывать их за плохой результат ЕдРа, как школьников (вообще-то их есть за что отчитывать кроме результата ЕдРа и вообще-то у них по закону другая работа)? Прямо КПСС в лучшем виде…
Общество развивается быстрее власти, и оно ушло сейчас в негатив. Это, в сочетании с теми изменениями, которые идут в мире, лишает нашу страну главного конкурентного преимущества. Я всегда выступал и выступаю за позитив и развитие. Ну что же, будем опять отвечать на любимый вопрос "Что делать?" .
Прежде всего, нужно констатировать важные аксиомы:
1. Значительное количество наших граждан считает выборы несправедливыми, а многие не пошли на выборы, потому что считают, что им не за кого голосовать.
2. После двух последних съездов ЕдРа тандема больше нет.
3. Нравится это кому-то или нет, Путин пока единственный, кто хотя бы как-то управляет этой неэффективной государственной машиной.
4. Революции в России всегда приводили к человеческим жертвам и снижению уровня жизни граждан.
5. Неадекватное отражение государственными телеканалами происходящего в стране работает против власти.
Предлагаю перечень увязанных между собой действий, рассчитанных на опережение текущей ситуации (пока власть все время отстает):
1. Во всех крупных и средних городах выделить удобные для граждан места для свободного выражения мнений (аналог Гайд-парка в Лондоне, в Москве, например, Парк им. Горького). Пусть интернет выйдет на улицу, и у власти будет возможность слушать своих граждан и принимать нужные решения (а не выводить "Наших", провоцируя противостояние в обществе, и не заниматься ремонтом трубопровода именно там, где люди хотят собраться).
2. Партия власти нуждается в серьезном реформировании, и сделать это должен человек, который вел эту партию на выборы. Медведев, как лидер списка, мог бы эффективно руководить Думой, сделав ее "местом для дискуссий" и центром законодательной инициативы.
3. В этом случае Путин по Конституции становится и.о. Президента и будет обладать всеми необходимыми полномочиями (что соответствует реальному политическому рейтингу) для проведения честных президентских выборов, которые должны радикально отличаться упрощенным доступом к возможности стать кандидатом в Президенты (для граждан снизить объем подписей в 10 раз, дать возможность выдвигать кандидатов не только парламентским партиям, но и общественным организациям и блокам). Это откроет мощный политический и социальный лифт, ощущение справедливости и правильности действий власти, даст победившему кандидату политический ресурс на проведение реформ и формирование нового правительства доверия.
4. После президентских выборов провести реформу политической системы (наши предложения были подробно изложены в http://md-prokhorov.livejournal.com/80796.html Манифесте "Правого дела" образца до 14.09.11) и в случае, если спокойствие и позитив в стране не восстановлены, провести новые выборы в Думу. И обществу, и власти предстоит пройти большой путь навстречу друг-другу. Но другого пути я не вижу, и своей стране не желаю…P.S. А кстати, напоследок задаю модный риторический вопрос: А не пора бы списать на берег "кукловодов" и "волшебников"? Плыть бы стало и быстрее, и свежее :-)
http://md-prokhorov.livejournal.com/84044.html

SELECT, INSERT, UPDATE, BLOB, MSEIDE, query

Сегодня мы поговорим об методах Insert, Edit, Open, Post, ApplyUpdates компонента tmsesqlquery.
tmsesqlquery предоставляет возможность редактировать с помощью вышеприведенных методов таблицу в базе данных написав лишь один SQL скрипт для запроса собственно таблицы из базы данных.
Итак, действующие лица:
  • con:tmseibconnection
  • writetran:tmsesqltransaction
  • queryW:tmsesqlquery
  • Таблица CONTESTS (CCID INTEGER NOT NULL, NAME CHAR (30), ABOUT BLOB SUB_TYPE 0 SEGMENT SIZE 4096);

writetran:=tmsesqltransaction.Create (nil);
writetran.Database:=con;
queryW:=tmsesqlquery.Create (nil);
queryW.Database:=con;
queryW.Transaction:=writetran;
queryW.SQL.SetText ('SELECT * FROM CONTESTS WHERE CCID = :pCCID');(*Оператор запроса данных из таблицы contests для редактирования. Операторы для обновления полей, вставки и удаления записей в query генерируются автоматически*)
queryW.params.ParamByName ('pCCID').AsInteger:=1;(*Присваиваем параметру значение*)
queryW.Open;(*Открываем query*)
queryW.Edit;(*Переводим query в режим редактирования записей*)
queryW.fields.FieldByName ('NAME').AsString:='OLOLO';
queryW.Post;(*Подтверждаем редактирование*)
queryW.ApplyUpdates;(*Отправляем отредактированные данные в базу данных*)
queryW.Close;(*Закрываем query*)
writetran.commit;(*Подтверждаем транзакцию. Данные записаны.*)

queryW.SQL.SetText ('SELECT * FROM CONTESTS WHERE CCID = :pCCID');
queryW.params.ParamByName ('pCCID').AsInteger:=1;
queryW.Open;
queryW.Insert;(*Переводим query в режим INSERT. Все дальнейшие действия с запрошенными полями - действия с полями записи, которая будет вставлена в выбранную скриптом таблицу *)
queryW.fields.FieldByName ('CCID').AsInteger:=2;(*Задаем значение поля CCID*)
queryW.fields.FieldByName ('ABOUT').AsString:='OLOLO2';(*Задаем значение поля NAME*)
queryW.Post;
queryW.ApplyUpdates;
queryW.Close;
writetran.commit;(*Подтверждаем транзакцию, данные записаны*)

queryW.SQL.SetText ('SELECT * FROM CONTESTS WHERE CCID = :pCCID');
queryW.params.ParamByName ('pCCID').AsInteger:=1;
queryW.Open;(*А это просто запрос на чтение*)
for i:=1 to queryW.RecordCount do //RecordCount - количество полученных записей
begin
  queryW.RecNo:=j; // RecNo - номер записи, с которой мы работаем через "fields"
  ID[i]:=queryW.fields.FieldByName ('CCID').AsInteger;
end;

writetran.commit;

Таким образом сверху приведены три откомментированных примера редактирования, вставки и чтения записей из таблицы в базе данных без использования SQL операторов UPDATE, INSERT, методов CreateBlobStream и тому подобного. Все есть в query. Просто и удобно. Blob поля полностью поддерживаются. Важно не забывать всегда из таблицы запрашивать ключ, которому мы ищем данные, иначе mseide не сможет сгенерировать операторы для редактирования, удаления и вставки записей.

Список упомянутых методов класса tmsesqlquery:

  • open - "открывает" query. Посылает первый запрос к СУБД и получает данные.
  • edit - перевод query в режим редактирования записей.
  • insert - перевод query в режим вставки записей.
  • post - подтверждение изменений для query.
  • applyupdates - загрузка подтвержденных изменений в базу данных, для их окончательного сохранения надо сделать commit транзакции в рамках которой работал query.
  • close - заканчивает работу query.
  • fields.FieldByName (s:string).AsType - доступ к полю s текущей записи с номером query.RecNo как к переменной с типом Type.
  • params.ParamByName (s:string).AsType - доступ к параметру s как к переменной с типом Type.
  • SQL.SetText (s:string) - устанавливает s как оператор, который будет выполнен СУБД после отправки первого запроса методом open. Можно еще делать так: SQL:=SELTASK где SELTASK:tsqlstringlist;

среда, 7 декабря 2011 г.

Моя реплика о поствыборной ситуации в России 5-6 декабря 2011 года.


У меня такое чувство, что все сошли с ума. За несколько дней произошли события, которые казались невозможными одно время. Митинг на чистых прудах, войска в Москве, выступления в Питере. Прошли думские выборы и что-то просто щелкнуло в головах у людей.
Что же будет на президентских выборах? По-моему то же самое. Надеюсь, время до них даст подготовиться немногочисленным умным людям во власти к волне новых выступлений. Не то чтобы я за Путина и Единую Россию, скорее даже наоборот... Просто Россия - ненормальная страна. Если в Европе чередуются правители: умный - дурак, то в России: дурак-тиран - дурак-тихий - дурак-реформатор. И еще такая чисто российская традиция: скинув старую власть надо заиметь политическую элиту еще более худшего качества, чем была (см. революцию 1917 года, Дворцовые перевороты и тому подобное). Поэтому революции и бунты в России - страшное дело. Преобразования у нас должны идти сверху. Воздействие на власть снизу должно вестись массово, легитимными методами. Это сохраняет государство и заставляет действовать в угоду обществу. Главная задача сейчас - преодолеть мощную социально-политическую разнородность общества. Она мешает и консолидации оппозиционых сил и проведению радикальных преобразований, которые ведут обычно к расколу общества в России.
Оппозиция, если уж она есть, должна научиться воздействовать на власть легитимными методами. Перевороты в современном мире, ни к чему хорошему не ведут. Ну скинут Медведева, Путина с компанией и что дальше? Новые придут. На местах ничего не поменяется. Как сидели хапуги, так и будут сидеть. Их когти глубоко впились в административную систему. 
Со всеми нашими проблемами по определению может справиться только государство. У него есть и полномочия и средства, которые, правда, оно не использует. Значит Наша задача - изменить существующее государство, сохранить его, заставить работать, а не ввергать и без того нестабильное, как всегда, расколотое российское общество в неизвестность. Наша задача - создать адекватную независимую оппозицию, не воровать и жить по закону. Государство в России, так как это высшая форма организации общества, должна остаться в целости для сохранения нашего суверенитета и занятых территорий. Закон должен всеми свято соблюдаться, так как это гарантия легитимности преобразований и безопасности общества и каждого гражданина в частности.
Опасность массовых выступлений для России огромна. Россия - страна с ядерным оружием, огромными запасами энергоресурсов, нестабильным обществом. 
  • На волне выступлений легко подняться "оранжевому" лидеру, который контролируя беснующуюся, ничего не осознающую толпу, захватит власть;
  • Россия - огромная страна, которая может не пережить очередной революции за последние 20 лет, так как сепаратные тенденции достаточно сильны.
  • Западные партнеры в случае чего постараются отхватить максимально большой "кусок".
Возникает еще один вопрос: двойные стандарты по отношению к подавлению демонстраций и выступлений. Очень советую посмотреть как это делалось в Англии. И почитать здесь: http://trueinform.ru/modules.php?name=News&file=article&sid=1786 и посмотреть здесь: http://www.youtube.com/watch?v=belRwME15HU. При этом считается, что Россия - полицейское государство. Кстати говоря, при полицейском государстве такого бардака не бывает.

воскресенье, 4 декабря 2011 г.

Недавно писал Мартину.



Set the select statement ("SQL" property = "select * from table1"), the insert, delete and update statements are built automatically. Then use tmsesqlquery.edit(), insert(), delete() and post() or cancel() and access the fields. In order to write the data to the server call tmsesqlquery.applyupdates(). In order to commit call tmsesqltransaction.commit() or commitretaining(). applyupdates() will be called automatically after post() if tmsesqlquery.controller.options dso_autoapply is set. commitretaining() will be called automatically after applyupdates if dso_autocommitret is set. commit() will be called automatically after applyupdates if dso_autocommit is set. Martin
Проще говоря у меня не работала загрузка данных в blob:
queryW:=tmsesqlquery.Create (nil);
queryW.Database:=con;
queryW.Transaction:=writetran;
queryW.StatementType:=stUpdate;
queryW.SQL:=UPDCONTEST;//UPDCONTEST is correct and given before
queryW.Prepare;   
queryW.params.ParamByName ('pNAME').AsString:=name.text;
queryW.params.ParamByName ('pABOUT').AsBlob:=about;
queryW.params.ParamByName ('pLOGO').AsBlob:=img;
queryW.params.ParamByName ('pID').AsInteger:=ID; 
queryW.ExecSQL;
writetran.commit;

Оказалось, что blob в firebird передается по специальному протоколу. Я спросил: "Может мне использовать CreateBlobStream", в ответ мне пришло загадочное сообщение: "А может использовать tmsesqlquery". Я призадумался. В голову по этому поводу так и не пришли мысли, поэтому я сказал прямо: "А как использовать tmsesqlquery?"В ответ Мартин написал эпичнейшее описание, с которого начинается эта запись в моем блоге. Описание работы с tmsesqlquery в mseide. Это просто и удобно:
  • query.sql.settext (select* from table1); //Это нужно чтобы выбрать записи и столбцы для работы. Скрипты для вставки в это таблицу, обновления записей и удаления генерируются автоматически.
  • Использовать методы tmsesqlquery.edit(), tmsesqlquery.insert(), tmsesqlquery.delete(), tmsesqlquery.post() или tmsesqlquery.cancel() для работы с выбранными полями.
  • ВСЕ! И никаких CreateBlobStream или подобного маразма!
Скажем дружно Мартину спасибо за это! =)

понедельник, 31 октября 2011 г.

О MSEIDE. Параметры в tmsesqlscript.

Что такое вообще так называемые "параметры" с точки зрения компонент, связанных с работой с СУБД? Это переменные в SQL скрипте. Т.е. перед моментом исполнения скрипта, на место переменной в скрипте поставляется конкретное текстовое или численное значение и скрипт отправляется СУБД на исполнение.
Синтаксис параметров в скрипте такой:
:VAR_NAME
Пример использования:
SELECT PASS, MAIL FROM MEMBERS WHERE MAIL = :pEMAIL;
:pEMAIL в данном случае - параметр.
Параметры добавляются в сам компонент скрипта (во всяком случае я так делал и это работало). Как всегда способа добавления два: "run-time"и графический.


В графическом:
  • Выделяем нужный компонент скрипта;
  • В инспекторе объектов ищем свойство params.coumt и задаем нужное количество параметров;
  • Раскрываем (слева плюсик появляется), перед нами появляется список параметров, которые можно спокойно редактировать. 
Поле name - имя параметра в SQL скрипте (тот же pEMAIL), двоеточие указывать не надо. Имена параметрам принято давать заглавными буквами с префиксом "p".
Поле DataType - тип данных.
Поле Size - размер параметра (поля value).


В "run-time" на мой взгляд все гораздо проще:
var VAR:TYPE;NAME:STRING;
...
script.params[0].AsTYPE:=VAR;
script.params[0].Name:=NAME;
Например:
var email:string;
...
query.SQL.SetText:=SELECT PASS, MAIL FROM MEMBERS WHERE MAIL = :pEMAIL;
query.params[0].AsString:=EMAIL;
query.params[0].Name:='pEMAIL';

Все! MSEIDE автоматически создает поля параметров при разборе sql-оператора. К ним обращается по номеру. Номер параметра - его номер от начала скрипта. При помощи AsType мы указываем тип параметра и задаем его значение. Так же можно обращаться к параметру по его имени.
Всегда сначала идет "AsType", а затем заполняются поля параметра.
Параметры есть и в tMseSqlScript и в tMseSqlQuery и во многих других компонентах, где нужно писать SQL-скрипты. Но об этом, и в частности о query, в следующей статье.

суббота, 8 октября 2011 г.

О MSEIDE. Добавление элементов интерфейса в программном коде, создание и соединение с БД.

Добавление элементов интерфейса в программном коде.
Для этого необходимо:
1) Создать виджет, принадлежащий или форме или другому потомку класса TComponent
2) Вставить созданный виджет туда, куда он принадлежит.
3) ...
4) PROFIT!!!


Например:
  var mainfo:tmainfo;Mark:tbooleanedit;
  ...
  Mark:=tbooleanedit.Create(mainfo.MainTable);
  mainfo.Maintable.InsertWidget (Mark);
  ...


Виджет создан! Если он не отображается, то надо свойству visible:=true, если не работает, что свойству enabled:=true. Примерно так! =)


Создание базы данных.
В MSEIDE богатый инструмент для работы с базами данных. Мы будет рассматривать это на примере работы с firebird 2.5.
Для создания базы данных firebird надо перетащить на форму следующие компоненты с вкладки DB окна Component Palette:
1) tmseibconnection - компонент подключения
2) tmsesqltransaction - компонент транзакции для каких-то темных делишек подключения (типа создания БД) =)
3) tmsesqlscript - компонент sql скрипта, который потом будет создавать нашу таблицу.
Дальше необходимо заполнить все поля связанные с местоположением и доступом к базе данных через инспектор объектов у компонента типа tmseibconnection.
После устанавливаем связь между tmseibconnection и tmsesqltransaction. Т.е. указываем через инспектор у компонента типа tmsesqltransaction в поле database наш компонент подключения, а у компонента подключения в поле transaction указываем наш компонент типа tmsesqltransaction.
Теперь они связаны и готовы к работе.
В mseide у компонента tmseibconnection есть специальный метод для создания базы данных - createdatabase (sql оператор создания базы данных).


Например:
var reg_tran:tmsesqltransaction; con:tmseibconnection;
...
con.createdatabase ('CREATE DATABASE ''C:\firdt.fdb'' user ''sysdba'' password ''MASTERKEY'' PAGE_SIZE 4096 DEFAULT CHARACTER SET ASCII;');
con.connected;//База данных создана и приложение выполнило к ней подключение


Теперь надо связать наш tmsesqlscript с подключением и транзакцией в рамках которой мы сейчас работаем. В принципе для скрипта без разницы через какую транзакцию работать. Но мы не будем их плодить, так что пускай все компоненты будут работать через одну и ту же транзакцию.
Чтобы связать tmsesqlscript опять надо воспользоваться инспектором объектов и указать в поле database наше подключение, а в поле transaction соответственно транзакцию.
В поле SQL компонента типа tmsesqlscript пишем скрипт. Для его исполнения необходимо будет сделать вызвать метод выполнения скрипта Execute и подтвердить транзакцию, через которую он работает.


Например:
  var reg_sctipt:tmsesqlscript;reg_tran:tmsesqltransaction;
  ...
  REG_SCRIPT.EXECUTE;//метод выполнения скрыпта
  reg_tran.commit;


Без подтверждения транзакции никакие изменения в БД не сохранятся!
Кстати, как вы заметили, я не сказал про параметры в tmsesqlscript. А они там есть! Увы, но о этом я расскажу в следующий раз =)