■ blog - 最新エントリ
 最新エントリ配信

カテゴリ
(36)
DJ(12)
Delphi(17)
UG(1)


最新エントリ
2008/05/21
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (12:52 am)
TClientDataSetで、blobフィールドを使用すると発生。
海外でも、あまり発生していないバグのようで、
その対処方は、どこにも書いていない・・・


が、



Master/Detailの関係下で、
登録後、Refreshしていることが、原因ト判明
Close
Open
していやると、エラーは回避される。
2008/03/30
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (3:53 am)
QuickReportを使った、
複雑なレポートの作り方が、あまりないので、
書き残してみる。


唯一他に、使ったことのあるAccessレポートだと、
サブレポートというもので、
別のレポートを、自由な位置に置くことが出来る。

残念ながら、
QuickReportには、この機能はないが、
それに似た機能が、この「SubDetail」である。



今回は、
ヘッダー -> ディテイル -> サブディテイル
で、

PageHeader
GroupHeader
SubDetail (ディテイル用DataSet)
GroupHeader (TQrBand) *1
SubDetail (サブディテイル用DataSet)*2
GroupFooter
GroupFooter
PageFooter

の構成である。

*1 : TQrGroupにすると、なんか変。
*2 : *1のGroupHeader.OnBeforePrintにて、サブディテイル用DataSetを、Open。後は勝手にやってくれる。


ご参考まで。
2008/03/15
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (12:59 am)
Delphi 7 + QuickReport 3.5x
にて、


PageHeader
GroupHeader
Detail
GroupFooter

の形式の納品書を作成した。


ところが、印刷してみると、
1組目のグループが、2ページにまたがるなどする場合、
2組目のGroupHeaderが印刷されない。

GroupHeaderには、
顧客CDや、住所などの情報が含まれているため、
データの欠落は、とても厳しい・・・



このため、各GroupFooterにて、

  if not QuickReport.DataSet.Eof then
    QuickReport.NewPage

※GroupHeader.ForceNewPageは、使わない。


しかし、Eofは、最終レコードの
次のレコードに移動しようとした時、
レコードが存在しない場合にのみ、Trueとなるため、

最後に、空のページが印刷されていた。


100枚近い印刷なら、目をつぶれるものの、
1,2枚の毎に、印刷した場合にも、
必ず空のページが印刷されるのはもったいない・・・




いろいろ試してみたが、
最終レコードであることがわかれば、解決するわけで、

  with QuickReport.DataSet do
    if not RecNO + 1 < RecordCount then
      QuickReport.NewPage

無事、空白ページなく、印刷に成功。


QuickReport 4.07に更新しても、同様のバグは発生しており、
他、多数バグもあるが・・・
exeに組み込める、QuickReportの手軽さは、捨てられない・・・


運送伝票の印刷は、
用紙指定の方法を駆使しても、困難であったため、
アクセスを使っているが、
コントロールパネルのプリンターにて、
デフォルトの用紙を、最初から指定しておいて
(例:連帳 15 x 4.5incなど)
プレビュー/印刷の前に、
PrinterSetupDialogを表示し、
プリンターを、上記の指定したプリンターを使うと、
うまくいったような気がする。
2008/03/09
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (4:50 am)
ついに、入手。
もちろん、ソース付き。

Delphi標準のレポートツールで、
Exeに印刷機能を埋め込める
(外部ソフトのインストールが不要)ので、
重宝はしてるのですが、
如何せんバグが多いくせ者です・・・


重大なバグの1つで、
Qrが持つ用紙サイズでしか、印刷できないので、
特に、連帳(運送伝票)は、
いろいろとコードを書く必要がある。


最近見つけたもっとも簡単な方法は、
プリンターのデフォルト用紙を、その連帳などにして、
1つ、プリンターを作ってしまう事。
※使用時に、プリンターを切換。
 印刷する前に、プリンターの設定が出来ていると、機嫌が良い。


しかし、今回、
時間もないので、
連帳の印刷には、ACCESSレポートを使う事にしたが、
これはこれで、癖があり、
一応、癖を克服し、望み通りに動いてくれています。



さて、何が新しくなったのか?
いくつかコンポーネントが追加されているが、
上のバグは直してあるのか?
疑問ではあるが、
やはり「サブレポート」の機能がない・・・
ないとあるとでは、ある方が当然便利なわけで、
アクセスだと、可能である。


見切りを付けて、他のレポートツールに移行したいのだが、
なかなか見切りが付けられません><;
2008/01/22
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (11:23 am)
バーコード検品用のプログラムを作るため、
当初、キーエンスのBT-500という機を検討していましたが、
最上位のC++コンパイラーがないと、ろくなプログラムも書けず、
開発環境をそろえるだけで、60万。
IDEではないので、恐ろしく作りにくい・・・
しかも、60万もあれば、
CodeGear RAD Studio 2007 Architect が楽に買えるわな・・・

そんな訳で、
バーコードスキャナーが付いたWindowsCE機を探しました。
最終的にチョイスしたのは、「Casio DT-5200」
値段的にも、機能的にも一番確かなものでした。
※現在は、新しく小型になった新型がリリースされています。



そして、要約
.Net Compact Framework(以下、CF)開発環境が出来ました。

参)Delphi 2006 で行う PocketPC アプリケーション開発
http://dn.codegear.com/article/33700

ここに書いてある通りにすれば、出来たんです。
諄いようですが、「書いてある通りにすれば・・・」
何度も読み直しましたが、
理解出来ず、
今日に至るまで、半年の時間を要しました・・・

すんなり進んだ人って、いるんだろうか・・・


まー、実のところ、
まだ.netもさわったことがなく、
.netで、DBの接続方式を模索中。
一応、↑資料には方法は書いてありますが、
あくまで、PocketPC内のXMLを読み書きする方法で、
直接、SqlServerを読みにいく方法が書いてない・・・

SqlClientというアセンブリを使うと、
可能なそうだが、サンプルがない・・・
Delphi付属のDemoを見るにも、CFでは使えなさそう・・・
ごりごり書いてみるしか・・・(ry
2007/12/19
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (12:47 am)
おそらく日本で、もしくは世界でも・・・
ちゃんと、TAgrregateを使ってるのは、数少なく、
文献も「さわり」程度で、
詳しく調べるのは、ソース頼り。


今回は、
TAggregate.Currency = True
にしても、
標準の通貨フォーマット = ¥10,000,000
で、表示されず、

DisplayFormatに、何を指定しても、
無視されてしまうため、
何とか、指定のフォーマットで、
表示するために試行錯誤した記録です。



まずは、
TAggregate.GetText
にて、Format関数で、表記してみるが、
1. パラメーターのTextには、値が入っておらず、
2. Sender.Valueで、値をとると、エラーになる。

※ 2.は、値が入っているときは、問題ありませんが、
挿入後など、集計するデータがない場合、
エラーになります。
たとえば、VarIsNull, VarIsEmptyでトラップ使用としましたが、
トラップできず、
AsString, AsVariant, AsIntegerで
直接値をとろうとしましたが、

> function TField.GetAsString Boolean;

上記関数で、エラー扱いになります。
なぜか、Variantが取り出せない・・・


v: Variant
と宣言し、代入しても、同様のエラー
ポインターで参照してるから、無理くさい。


DB.pas / 6896行目

if FResultType in [ftFloat, ftCurrency] then 

デバッグしてみると、
FResultTypeが、ftCurrencyではなく、
ftBCD(小型のftCurrency)になっているため、
このif文をスルー


結局、無念ながら、
オリジナルVCLをいじる羽目に・・・(-_-;)


if FResultType in [ftFloat, ftCurrency, ftBCD, ftInteger] then 


これで、一応希望通りの動作に。
普通だと「Delphiの仕様で、出来ませーん」
と、ろくに調べもしないで、返事しちゃうんだろうけど、
だからといって、
数時間もかけて調べも、「ふーん」で終わり
(*ーー)ヾ( ̄▽ ̄*) ナデナデ
2007/11/15
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (4:33 pm)
パスの通ったフォルダーに「midas.dll」を突っ込む。

位置情報をレジストリーに登録

>> regsvr32 /u C:\windows\system32\midas.dll

参)HepCat? をUSB メモリに入れて持ち歩く為の下準備 http://alectrope.ddo.jp/mt/archives/2004/04/23/hepcat
2007/10/29
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (12:38 pm)
DBの基本的な概念として、

例えば、
発注伝票(紙)を見れば、
* マスター(ヘッダー): 発注先の情報や納期
* ディテイル(明細): 商品名・発注数
など、
1対多の親子関係になっており、

これは、重複したデータを登録しないで、
ディスクスペースを有効に利用するためで、
「今となっては・・・」という話もあるが・・・


さらに、
マスターには、ディテイルの合計をしばしば記録することがある。
例えば、発注数や、発注金額などが、それである。


一般的なやり方としては、SQLにて(トリガー)

update h set
  発注数   = 発注数SUM 
  発注金額 = 発注金額SUM 
from
  発注H h
  right join (
  select
    発注NO,
    Sum(発注数)  [発注数SUM],
    Sum(発注金額) [発注金額SUM]
  from 受注D
  group by 発注NO
  ) d
  on d.発注NO = h.発注NO


しかし、トランザクションを開始していると、
上記SQLでは、変更される前の合計で、
リアルタイムな合計を画面上に表示するには、ちょっと無理がある。


それを解決するには、
好みではないが、
DataSetのカーソル行をブックマークして、
1行目〜最終行を、ループして合計し、
元のカーソル行に戻す。

もしくは、
合計値から、変更された分だけ、差分を計算する。


[40517] RE: DBGRID で合計の計算について
で、紹介されている方法だ。

コードをダラダラと書かないといけないので、不採用。



上記リンク先では、もう1つのやり方が紹介されている。
TClientDataSet.Aggregatesを利用する方法

詳細は、上記URLを覗いてもらうとして、
ただし、欠点として、挿入されたレコードについては、
使えないそうだが・・・
ひとまず、その通りにやってみたが、動かない!・・・
はて?・・・


WEBを探してみると、
まったくもって、TAggregateについて書かれたページがなかくて・・・
ってことは、一般的じゃないのか?
が、CodeGear内で発見!
http://dn.codegear.com/jp/article/29272

日本語の解説だと、概略ですが、
http://hpcgi1.nifty.com/MADIA/DelphiBBS/
wwwlng.cgi?print+200601/06010051.txt

Delphiのヘルプにも、載っていますが、難解・・・
「保守される集合体」で検索。


要は、

1. ClientDataSet?.AggregateActive? = True
2. TAggregateFieldを作成。(項目の種類を「集合体」に)
2-1. Active = True
2-2. Expression = Sum(出荷数)
2-3. FieldName? = 出荷数Agg // これは自由に。

以上で、基本設定は終わり。

あとは、適切なタイミングで、データを書き換える。


私が模索した方法は、
TClientDataSet.OnCalcFieldに、記述。
ただし、データセットを開いた時点でも計算されるので、
なにか、フラグを立てて、
ディテイルが変更された後のタイミングでのみ、更新するのが良いです。

私の場合は、TDataSource.OnChangeにて、
マスター(ヘッダー)レベルで、
トランザクションを開始していますので、これをフラグと見立て、

  { 受注H * 集計 }
  if (dmMng.ADOConSqlServer.InTransaction) then
    with cdsOrderH do begin
      if not (State in [dsEdit, dsInsert]) then
        Edit;

      FieldValues['出荷数']   := cdsOrderD.FieldValues['出荷数Agg'];
  end;

しました。

まだまだ知らないことが天こ盛り!
奥深さに、Amazing!
2007/10/17
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (11:43 am)
約3ヶ月悩んだ・・・
使用目的は、「ClientDataSetで、UpdateSQLを発行」


1. [49956] Re: TADOQueryのParameter にNULL を設定する方法
2. ADOでパラメータに空文字

この通りにやっても、うまくいかなかったので、
無理矢理、TAdoTableで更新をかけたりと、
スマートじゃない方法で逃げていたが、やはり許せないので・・・



Param.Size := Field.Size; //※1
if Param.Size <= 0 then
  Param.Size := 1; // ※2
if VarIsNull(Value) then
  Param.DataType := ftString; //※3



1. 文字の場合、デフォルトサイズだと、欠けてしまうので、サイズを指定。
2. Parameter.Size > 0 をセット
3. Parameter.DataType = ftString(Nullの場合に限る)
のおまじないが必要と言うことだ。


ちゃんと文章が理解できれば、
こんなに悩むことはなかったのだが・・・
2007/09/09
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (3:50 pm)
いつものようにThinkItからメールが来て、
何気なく開くと、
DELPHIのマークが

Delphiは、私がこよなく愛するプログラミングツールで、
Microsoft VB/C, Javaに圧倒されていますが、
最近、プロモーション頑張ってくれているBorland.
http://www.thinkit.co.jp/free/article/0709/12/1/



私は基本、Delphiしか出来ません。
なんでこうなったかは、またおいおい・・・
VBで作って。という仕事は、出来ませんし、断ります。
※保守はします。(しています)

でも、クライアントからしたら
* 目的が達成できて、
* コストが安ければ、
なんでも良いと思うんですよね。

「保守がどうのこうのと」よく聞きますが、
どうせ人が書いたソースなんて、どんな言語だって分かりにくいもので、
3〜5年に1度のリース切れで、業者が変われば、
全部書き換えになるわけですから・・・


さて、弊社は今後、
弱さを、強さに変え、
そして、

を掲げ、
DELPHI専門チームで進んでいく予定です。


求む:Delphiエンジニア!
2007/08/20
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (9:24 pm)
Borland Developer Studio 2006でQuickReport? 4を使う
http://dn.codegear.com/article/33877
にて、

日本の販売代理店からの購入も可能です。現在、ComponentSourceにて、取り扱い可能(ComponentSourceオンラインショップには登録されていません)なので、購入を検討されている方は、直接問い合わせをしてください。
http://www.componentsource.co.jp/

とのこと。


言語の壁に、ぶち当たって躊躇しておりました・・・
こういう事は、もっと大きく知らしてください!
Borlandさん・・・
2007/07/08
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (3:21 pm)
参考 >> [75696] Re: ClientDataSetでApplyUpdateを行う方法

を元に、ADO+ClientDataSetにて、
TUpdateSQLを使い、更新SQLなどを発行。


Borland内のページがすべて抹消されたので
WhitePaperが見つからなかったが、
DBTables.SetParamsと同じロジックだと言うことで、
改良してみた。

※フィールド名=パラメーター名である必要がある。


procedure Tdm.SetUSQLParams(Query: TAdoQuery;
  DeltaDS: TClientDataSet);
var
  I: Integer;
  Old: Boolean;
  Param: TParameter;
  PName: string;
  Field: TField;
  Value: Variant;
begin
  if not Assigned(DeltaDs) then Exit;
  with Query do begin
    for I := 0 to Parameters.Count - 1 do begin
      Param := Parameters[I];
      PName := Param.Name;
      Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0;
      if Old then System.Delete(PName, 1, 4);
      Field := DeltaDs.FindField(PName);
      if not Assigned(Field) then Continue;
      if not Old then begin
        Value := Field.NewValue;
        if VarIsClear(Value) then Value := Field.OldValue;
        Param.Value := Value;
      end else
        Field.Value := Field.OldValue;

      // debug
      writeln(Format('%s: %s', [Parameters[i].Name, 
Parameters[i].Value]));
    end;
  end;

end;

procedure Tdm.dspSupplierBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
  UpdateKind: TUpdateKind; var Applied: Boolean);
begin
  { SQLを使って、更新 }
    with dm1.AdoTmpQuery do begin
      SQL.Assign(uSqlSupplier.Query[UpdateKind].SQL);


      SetUSQLParams(dm1.AdoTmpQuery, TClientDataSet(DeltaDS));
      ExecSQL;
    end;

    Applied := True;
end;

2007/06/28
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (1:15 am)
この世界を志してから、まる14年。


まだ高校に通っていた頃、なけなしの小遣いを叩いて買った本が、
「Delphi 2.0J 32bitパワープログラミング」
です。@7500+tax

高3の時は、この道しかない!と腹をくくり、
厚みが7cmほどある本と、弁当を持って毎日通学していました。
英語の授業以外すべてを無視して、この本を読んでいました。
意味が分からなくても、無理矢理分かろうと努力していた想い出があります。


師匠もいないのでひたすら自分自身で調べ、
1日1ページも進めない日も諦めず、前進x2。


毎日ともなると、あまりにも重かったため、
無念にも本を章毎に切り分け、今は実家を探せばあるのだおるけど・・・
という状況です。

が、偶然にもヤフオクにて出品されているのを発見し、
想い出の一品として、原本を身元に置いて置きたいと思い、購入しました。

@4150+送料



想い出の一品は、まだ手元にありますか?

そういえば、hideの写真集も洪水で捨てざるを得なくなったなー・・・
2007/02/10
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (1:55 pm)
Delphi 7 Pro.Jにてテスト。



keyword='ほげ'; ←SJIS
HTTPEncode(UTF8Encode(WideString(keyword)));

SJIS(1バイト文字)

WideString(2バイト文字)

Unicode(UTF8)

HTTPEncode(%や/など、HTTPサーバーが処理しやすい形に加工)

その逆は、
AnsiString(UTF8Decode(HTTPDecode(keyword)));
で、通ると思います。こちらは未テスト。
2007/01/13
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (12:41 pm)
名は、古くから知っていましたが、
使う機会がなく、その用途も分からず、放置してきたWebBroker
何となく、CGI的な動きをするんだろうなーとは思っていましたが、
この度、棚卸しアプリの開発のため、調べてみました。


IIS(Windows 2K以降のOSにオプションで付いてくるHTTPサーバー)で、
(Apache for Windowsでも可)
PHPみたく、ゴリゴリと書いていくCGIなんだと思っていたのですが、
コンポーネントを貼り付け、コードを書く形なんですね。
同梱されたサンプルを実行してみると、
HTTPサーバーの機能から提供して、動いてくれるんです!
作り方にはいろいろあるみたいなんですが、
DBとも従来の形で接続出来るっぽいので、
比較的カンタンに、棚卸しのアプリが書けそうです。

他にも、ブラウザーで動く、業務アプリがカンタンに作れるんですね。
きっと、Javaでも出来ちゃうんんでしょうが、
残念ながらその知識がありませんOrz



棚卸しアプリの概要は、
これまでは、
1.在庫を調べ紙に記述し、
2.データを入力し、
3.サーバーデータと照合
4.不一致の商品の在庫を数え直す
って感じで、約2日かかっていました。
特に、2の作業をExcelで行っていたため、
作業を共有することが出来ず、その間、ただ待つしかなかったわけです。
約4時間・・・

大きな所だと、バーコードスキャナで入力し、
無線で繋いでリアルタイムでしていると思うんですが、
バーコードも複数用意しなければならないし・・・、
そこで目を付けたのが、携帯でした。

携帯を使えば、ハードウェアを追加せずに、
アプリの開発費だけで済むので、
電波の通るところなら、大概の倉庫で使えるアプリになります。
IntraWebを調べつつ、来月中には仕上げたいと思います。
2007/01/03
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (12:13 am)
2006.09.06 米 Borland社がWindowsアプリケーションの
開発ツールの「Turbo Delphi」などを発表。
Delphi(以下、D) 2006を買ってまもなくの事だった。
D2006は起動に時間がかかるので、ほとんど使っていない・・・
主力は、D7。軽くて、基本コンポーネントだけでそこそこ何とかなるんだが、
とりあえず、興味でインストールしてみようかな。


参>>> フリーのTurbo Delphiで始めるWindowsプログラミング@ITpro
2006/10/17
カテゴリ: ビジネス : 技術メモ : Delphi : 

執筆者: shoroji (7:57 am)
ファイルを作らずメモリ上で動作する TTable コンポーネント

Delphi7以降で、標準実装されているADOを使う方が便利かな。
高速に処理したいときは、別ですけど。
まぁ、メモリー上にファイルを作ってしまえば良いんだけどね。


DOSの時代、物理メモリーをドライブとして登録するのも一つだし、
確か、プログラムでもカンタンに書けたはず。

最近のイメージ
検索
うぇブログ カレンダー
«  «  2008 11月  »  »
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6
blog カテゴリ一覧
アーカイブ

[ソフトウェア販売・システム開発 / 求人 * しょろぢ屋]

メインメニュー
[所在地]
株式会社 しょろぢ屋
〒669-3465
兵庫県丹波市氷上町横田706-2
TEL: 非公開
FAX: 020-4622-1345
email: info@shoroji.com
今後の予定 (piCal)
予定なし
ログイン
ユーザ名:
パスワード:

[ソフトウェア販売・システム開発 / 求人 * しょろぢ屋]
Contents Right Reserved @shoroji.com &Special Thanks for Xoops & ALL !