ITDim
    Все будет итышно, когда вы с нами :)

Delphi импорт из xls в таблицу БД



unit _t_mn_unt_;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, ExtCtrls, comobj;

type
  TForm1 = class(TForm)
    _con_: TADOConnection;
    _clt_: TADODataSet;
    _buy_: TADODataSet;
    _ds_clt_: TDataSource;
    _ds_buy_: TDataSource;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    _opg_: TOpenDialog;
    Panel1: TPanel;
    Button1: TButton;
    _start_: TEdit;
    Label1: TLabel;
    _wrk_: TADOQuery;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


const
  xlCellTypeLastCell = $0000000B;
  appname = 'Read excel file';
  appbase = '_db_.mdb';
  Provider   = 'Provider=Microsoft.Jet.OLEDB.4.0;';
  PersistSI  = 'Persist Security Info=False';

type TClientRow = record
  _fio, _address, _birthplace : string;
  _birthdate : TDateTime;
end;

type TBuyRow = record
  _cl_id : integer;
  _product : string;
  _buydate : TDateTime;
end;

var
  Form1: TForm1;
  XLApp, Sheet, Range: OLEVariant;
  _tmp : TClientRow;
  _buy : TBuyRow;

implementation

{$R *.dfm}

function _get_sql(_type : integer) : string;
begin
  case _type of
// При работа с ADO у меня выдавало ошибку синтаксиса, пришлось 
// fio,address,birthdate,birthplace переделать в `fio`,`address`,`birthdate`,`birthplace` 
    0: Result :=  'INSERT INTO client(fio,address,birthdate,birthplace) VALUES' +
                  '(:fio,:address,:birthdate,:birthplace)';
    1: Result :=  'INSERT INTO buys(id_cl,predmet,buydate) VALUES' +
                  '(:id_cl,:predmet,:buydate)';
  end;
end;

function _ins_client_data( _val_ : TClientRow) : integer;
begin
  with _val_, Form1._wrk_ do
  begin
    SQL.Text := _get_sql(0);
    Parameters.ParamByName('fio').Value := _fio;
    Parameters.ParamByName('address').Value := _address;
    Parameters.ParamByName('birthdate').Value := _birthdate;
    Parameters.ParamByName('birthplace').Value := _birthplace;
    ExecSQL;
    SQL.Text := 'SELECT MAX(ID) AS MID FROM client';
    Open;
    Result := FieldByName('MID').AsInteger;
    Close;
  end;
end;

procedure _refresh_ds(_ds : TDataSet);
begin
  _ds.Close;
  _ds.Open;
end;

procedure _ins_buy_data(_val_ : TBuyRow);
begin
  with _val_, Form1._wrk_ do
  begin
    SQL.Text := _get_sql(1);
    Parameters.ParamByName('id_cl').Value := _cl_id;
    Parameters.ParamByName('predmet').Value := _product;
    Parameters.ParamByName('buydate').Value := _buydate;
    ExecSQL;
  end;
end;

function _get_value(x, y : integer) : string;
begin
  Result := VarToStr(XLApp.Cells.Item[x,y].Value);
end;

procedure _read_file(filename : string; start : integer);
var i, j, _cl : integer;
begin
  try
    XLApp := CreateOleObject('Excel.Application');
    XLApp.Visible := False;
    XLApp.Workbooks.Open(filename);
    Sheet := XLApp.Workbooks[ExtractFileName(filename)].WorkSheets[1];
    Range := Sheet.UsedRange;
    for i := start to Range.Rows.Count do
    begin
      try _tmp._birthdate :=  StrToDate(_get_value(i, 3)) except end;
      _tmp._fio := _get_value(i, 1);
      _tmp._address := _get_value(i, 2);
      _tmp._birthplace := _get_value(i, 4);
      _cl := _ins_client_data(_tmp);
      j := 5;
      while j < Range.Columns.Count do
      begin
        _buy._cl_id := _cl;
        _buy._product := _get_value(i, j);
        try _buy._buydate :=  StrToDate(_get_value(i, j + 1)) except end;
        _ins_buy_data(_buy);
        j := j + 2;
      end;
    end;
  finally
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  _opg_.Execute();
  _read_file(_opg_.FileName, StrToInt(_start_.Text));
  _refresh_ds(_clt_);
  _refresh_ds(_buy_);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := appname;
  _con_.Connected := false;
  _con_.ConnectionString := Provider + 'Data Source=' + appbase + ';' + PersistSI;
  _con_.Connected := true;
  _clt_.Open;
  _buy_.Open;
end;

end.

P.S. Содрано, но проверенно работает + переделать под свои нужды не сложно, что я и сделал

Языковые раскладки в Delphi:

Языковые раскладки в Delphi:
 ('00000419', 0); //RU
('00000409', 0); //Lat
('00000422', 0); //Ukr

D-link DSR-1000 fail






Решил я как-то купить это чудо, не люблю d-link, но в тот момент ничего 2 wan найти не удалось. Убитых 6 часов на настройку ничего не дали, в режиме 2 ванов работать никак не хотел, я конечно же перепрошился на последнюю версию, о чем в дальнейшем пожалел, с последней прошивки стандартным методом (через веб интерфейс) перепрошится на любую другую уже никак.

Самое интересное, что шестую прошивку должны были вообще снять, так как она в целом вообще неудачная (это я вычитал тогда еще на их форуме), там работает от силы 10%. Но настраивал я его месяца 3 назад, и  вот решил проверить вышла ли 7 версия, и вы не поверите, ее там еще нету и 6 не снята. Вот так думаю полежит еще пол годика маршрутизатор D-Link DSR-1000в шкафу и мб прийдет его время, а может еще до распродают их, потом снимут с производства и закроют проект)…

 


Преобразование даты в mysql

SELECT DATE_FORMAT("2011-11-08",'%d.%m.%Y');

Принтер в терминальном режиме

На компьютере, работающем под управлением любой версии Windows за исключением Windows Server 2003, при подключении к другому компьютеру под управлением Windows с помощью средства «Удаленное подключение к рабочему столу» или клиента служб терминалов версии 4.0 или 5.0 не выполняется перенаправление локальных принтеров. В результате при подключении к удаленному рабочему столу или во время сеанса служб терминалов не удается использовать локальные принтеры.
Например, если к порту DOT4 компьютера под управлением Windows XP подключено многофункциональное печатающее устройство, то при удаленном подключении к рабочему столу компьютеров под управлением Windows 2000 или Windows Server 2003 перенаправление данного устройства выполняться не будет. Данная проблема возникает, если имя порта принтера не начинается с символов COM, LPT или USB. По умолчанию перенаправление подобных портов выполняется только в Windows Server 2003. По умолчанию перенаправление многофункциональных печатающих устройств, подключенных к локальному компьютеру, выполняется только в Windows Server 2003, поскольку эти устройства используют порты DOT4.

Решение 1
Установить на сервер и на клиента одинаковые версии драйверов принтера.

Решение 2
Обновить на рабочей станции терминального клиента, с терминального сервера из папки C:\WINDOWS\system32\clients\tsclient

Решение 3
Если клиентский компьютер работает под управлением операционной системы, отличающейся от Windows Server 2003, то для устранения данной проблемы надо добавить в раздел реестра
HKEY_CURRENT_USER - Software - Microsoft - Terminal Server Client - Default - AddIns - RDPDR
параметр FilterQueueType типа DWORD и присвойте ему значение FFFFFFFF. Этот параметр предписывает операционной системе выполнять перенаправление для всех портов (включая порты DOT4).

Для добавления указанного параметра выполните следующие действия, а затем закройте редактор реестра. 
1. В меню Пуск выберите пункт Выполнить, введите команду regedit и нажмите кнопку ОК. 
2. Найдите и выделите следующий раздел реестра:
HKEY_CURRENT_USER - Software - Microsoft - Terminal Server Client - Default - AddIns - RDPDR 
3. В меню Правка последовательно выберите команды Создать и Параметр DWORD. 
4. Введите имя FilterQueueType и нажмите клавишу ВВОД. 
5. В меню Правка выберите команду Изменить. 
6. Введите значение FFFFFFFF и нажмите кнопку ОК. 
В результате будет разрешено выполнять перенаправление для всех портов.

"Такое поведение является особенностью данного продукта." говорит www.microsoft.com

Смена кодировки всех таблиц в бд (запрос)


Вот столкнулся с проблемой, манипуляций одной из программ с базой. Во время обновления программа начала выдавать ошибки вставки в базу данных, что не может привести в соотвествие таблицы с разными кодировками в едином запросе.

Ну решение очевидно, надо просто изменить у всех таблиц кодировку сравнения.
Но таблиц больше 100 из тисячи нужно было изменить, и вручную такое делать как-то не солидно, да и пипец как долго :).
Вощем нашел быстрый способ: взять имена всех таблиц из базы данных и составить sql запросы на изменение кодировки.
Затем скопировать их и выполнить как обычные запросы. Довольно неплохое решение.

Ограничение :) - Только mysql версии больше 5 поддерживает следующий запрос.

SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as sqlcode
FROM `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` = 'db_name'
ORDER BY 1

db_name замените на имя своей базы данных (схемы), а utf8 на нужную вам кодировку.

Установка настройка Postfix

Postfix
Postfix обладает всей мощью Sendmail, будучи полностью с ним совместимым, но при этом он гораздо проще в конфигурации. Кроме того, это мой любимый MTA, так что я не мог обойтись без описания его настройки. Итак (все действия производятся от имени root),

# apt-get install postfix

Скопируем главный настроечный файл postfix в нужное место (почему-то в Kubuntu он не устанавливается по-умолчанию)

# cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf

В конец этого файла добавим несколько строк, чтобы настроить доставку почты через gmail.

relayhost = smtp.gmail.com:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail_passwd
smtp_sasl_security_options = noanonymous

Теперь создадим указанный нами файл авторизации

# touch /etc/postfix/gmail_passwd

и добавим в него наши логин и пароль на gmail (my.name заменяем на логин, а password - на пароль).

smtp.gmail.com:587 my.name@gmail.com:password

Преобразуем этот файл в нужный формат (BDB) и для пущей безопасности защитим его от доступа простых смертных.

# postmap /etc/postfix/gmail_passwd
# chown root:postfix /etc/postfix/gmail_passwd*
# chmod 0640 /etc/postfix/gmail_passwd*

Перезапускаем Postfix для применения изменений.

# /etc/init.d/postfix restart

взято с: http://debback.blogspot.com/2008/04/mta-mutt-smtp.html