2018年7月20日金曜日

プログラムでHTMLを自由に書きたい! [ASP.net]


Literalコントロール!!

HTMLを記述したいところにLiteralコントロールを配置して、

プログラムから

Literal.Text = "HTMLを記述";

これで自由にHTMLを書ける。
何故か、なかなかこれにたどり着けなかった・・・。

2018年6月6日水曜日

行 2 のデータはコミットされませんでした。 [SQLServer]

SQL Server Management Studioの上位200行の編集で、
行コピーして貼り付けして編集しようと思ったら↓のエラー。

------------------------------------------------------
更新された行はありません。

行 2 のデータはコミットされませんでした。
エラー ソース: Microsoft.SqlServer.Management.DataTools。
エラー メッセージ: 行の値が更新または削除されたため、行が一意になりません。または、複数の行 (2 行) が変更されます。

エラーを修正して再実行するか、または Esc キーを押して変更を取り消してください。
------------------------------------------------------

主キーのないテーブルだったからこれが起きたぽい・・・。

片方の行だけ消したいけど削除もできない・・・。
UPDATEやDELETEのSQLでもどうしようもない・・・。
全行コピペしたから入れ直しなんてやってられない・・・。

[思いついた方法]
Management Studioで全行コピーしてExcelに貼り付け

Management Studioで全行削除

Excelで重複行の片方の行を削除

ExcelからManagement Studioに貼り付け

これで片方消せた。

2018年5月29日火曜日

印刷するプリンター・印刷設定をプログラムで動的に設定 [ACCESS]

ACCESSのレポートのプリンター設定を動的に設定したい!

標準モジュールにレポート印刷関数を作成。
--------------------------------------------------------------------

'==================================================
'レポートを印刷orプレビュー
'
'ReportName:レポート名
'PrintKbn:0=印刷 0<>プレビュー
'==================================================
Public Function PrintReport(ReportName As String, PrintKbn As Variant)
 
    Dim prtName     As String
    Dim setPrt      As Printer
    Dim rpt         As Report

    '警告非表示
    DoCmd.SetWarnings False

    'レポートを開く
    DoCmd.OpenReport ReportName, acViewPreview

    prtName = "プリンター名"
    Set setPrt = Application.Printers(prtName)
         
    Set rpt = Reports(ReportName)

    'レポートにプリンターを設定
    rpt.Printer = setPrt

    '用紙サイズ
    rpt.Printer.PaperSize = acPRPSA4
    '給紙用法
    rpt.Printer.PaperBin = acPRBNAuto
    '印刷向き
    rpt.Printer.Orientation = acPRORPortrait '縦
    rpt.Printer.Orientation = acPRORLandscape '横
    '余白
    rpt.Printer.TopMargin = Round(10 * 56.7, 2)
    rpt.Printer.BottomMargin = Round(20 * 56.7, 2)
    rpt.Printer.LeftMargin = Round(30 * 56.7, 2)
    rpt.Printer.RightMargin = Round(40 * 56.7, 2)

    If PrintKbn = 0 Then
        '印刷
        DoCmd.PrintOut
        'プレビューを閉じる
        DoCmd.Close acReport, ReportName, acSaveNo
    End If

    DoCmd.SetWarnings True

End Function

--------------------------------------------------------------------

後は各印刷の"DoCmd.OpenReport"を"PrintReport"に変更
--------------------------------------------------------------------
Private Sub Button_Click()

'DoCmd.OpenReport "レポート名", PrintKbn

'↑を↓に変更

  PrintReport "レポート名", PrintKbn
 
End Sub
--------------------------------------------------------------------

これでデータベースにプリンター名や印刷設定を登録し、PrintReport内でセットすれば、ユーザー毎に印刷するプリンターを切り替えれる。

プログラムのリリース時もACCESSごと上書きで大丈夫!

用紙サイズ・給紙方法がなかったり文字列で指定したい場合は↓
用意されていない用紙サイズ・給紙方法を文字列で取得

用意されていない用紙サイズ・給紙方法を文字列で取得 [ACCESS]

ACCESSの印刷設定で用紙サイズや給紙方法が用意されていない場合、簡単に設定できない・・・。

用紙サイズや給紙方法は割り当てられている数字をセットすれば良いみたいで、WindowsAPIを使って取得できるようなので、色々参考にして↓の関数を作成。

共通モジュールに取得関数を作成。
--------------------------------------------------------------------
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, ByVal pDefault As Long) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

' プリンタデバイスドライバの能力を取得する関数の宣言
Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long
' ある位置から別の位置にメモリブロックを移動する関数の宣言
Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
'PC名を取得する関数の宣言
Private Declare Function GetComputerName Lib "kernel32.dll" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Private Const DC_PAPERNAMES = 16
Private Const DC_PAPERS = 2
Private Const DC_BINNAMES = 12
Private Const DC_BINS = 6

'==================================================
'用紙サイズの番号を取得
'
'paraPrinterName:プリンタ名
'paraPaperName:用紙名
'==================================================
Public Function GetPaperSizeNumber(paraPrinterName As String, paraPaperName As String) As Integer

    Dim lPaperCount As Long
    Dim lCounter As Long
    Dim hPrinter As Long
    Dim sDevicePort As String
    Dim bytPaper() As Byte
    Dim strPaperName As String * 64
    Dim aintNubytPaper() As Integer
    Dim onePaperName As String
 
    GetPaperSizeNumber = -1
 
    sDevicePort = ""
 
    If OpenPrinter(paraPrinterName, hPrinter, 0) <> 0 Then

        ' バッファに必要なサイズ(用紙数)を取得
        lPaperCount = DeviceCapabilities(paraPrinterName, sDevicePort, DC_PAPERNAMES, ByVal vbNullString, 0)
        ReDim bytPaper(64 - 1, lPaperCount - 1)
        ReDim aintNubytPaper(1 To lPaperCount)
     
        '用紙名を取得
        Call DeviceCapabilities(paraPrinterName, sDevicePort, DC_PAPERNAMES, bytPaper(0, 0), 0)
        '用紙番号を取得
        Call DeviceCapabilities(paraPrinterName, sDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString)
        For lCounter = 0 To lPaperCount - 1
            ' 用紙名コピー
            MoveMemory ByVal strPaperName, bytPaper(0, lCounter), 64
            ' 用紙名追加
            onePaperName = Left(strPaperName, InStr(strPaperName, vbNullChar) - 1)
            ' 指定の用紙名が入っていたらその用紙番号を返す
            If InStr(LCase(onePaperName), LCase(paraPaperName)) > 0 Then
                GetPaperSizeNumber = aintNubytPaper(lCounter + 1)
                Exit For
            End If
        Next lCounter
     
        ClosePrinter (hPrinter)
    End If
End Function

'==================================================
'給紙方法の番号を取得
'
'paraPrinterName:プリンタ名
'paraPaperName:給紙方法
'==================================================
Public Function GetBinNumber(paraPrinterName As String, paraBinName As String) As Integer

    Dim lBinCount As Long
    Dim lCounter As Long
    Dim hPrinter As Long
    Dim sDevicePort As String
    Dim bytBin() As Byte
    Dim strBinName As String * 24
    Dim aintNubytBin() As Integer
    Dim oneBinName As String
 
    GetBinNumber = -1
 
    sDevicePort = ""
 
    If OpenPrinter(paraPrinterName, hPrinter, 0) <> 0 Then

        ' バッファに必要なサイズ(給紙方法数)を取得
        lBinCount = DeviceCapabilities(paraPrinterName, sDevicePort, DC_BINNAMES, ByVal vbNullString, 0)
        ReDim bytBin(24 - 1, lBinCount - 1)
        ReDim aintNubytBin(1 To lBinCount)
     
        '給紙方法名を取得
        Call DeviceCapabilities(paraPrinterName, sDevicePort, DC_BINNAMES, bytBin(0, 0), 0)
        '給紙方法番号を取得
        Call DeviceCapabilities(paraPrinterName, sDevicePort, DC_BINS, aintNubytBin(1), ByVal vbNullString)
        For lCounter = 0 To lBinCount - 1
            ' 給紙方法名コピー
            MoveMemory ByVal strBinName, bytBin(0, lCounter), 24
            ' 給紙方法名追加
            oneBinName = Left(strBinName, InStr(strBinName, vbNullChar) - 1)
            ' 指定の給紙方法名が入っていたらその給紙方法番号を返す
            If InStr(LCase(oneBinName), LCase(paraBinName)) > 0 Then
                GetBinNumber = aintNubytBin(lCounter + 1)
                Exit For
            End If
        Next lCounter
     
        ClosePrinter (hPrinter)
    End If
End Function

--------------------------------------------------------------------

これを使用してレポート設定時に↓のように文字列で用紙サイズや給紙方法が設定出来る!
--------------------------------------------------------------------
    '用紙サイズ
    rpt.Printer.PaperSize = GetPaperSizeNumber(prtName, "用紙名")
    '給紙用法
    rpt.Printer.PaperBin = GetBinNumber(prtName, "給紙方法名")
--------------------------------------------------------------------

2018年5月17日木曜日

~AspAccessCheck_26e88bde7472.tmp' へのアクセスが拒否されました。[ASP.net]

ASPプロジェクトをDebugではなくReleaseで実行すると、

が出てくる。

"間違えて[マイコードのみ]を無効にして続行"を押してしまったら、
Debugでもエラーで実行できなく・・・。


外がスローされました: 'System.UnauthorizedAccessException' (mscorlib.dll の中)

追加情報:パス 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\~AspAccessCheck_26e88bde7472.tmp' へのアクセスが拒否されました。


何のエラーかよく分からないけど、

Visual Studioの
[ツール]→[オプション]→[デバッグ]→[全般] の一覧の中に、
[マイ コードのみを有効にする]
があるのでこれをチェックしたら直った。

マイコードって何のこと・・・。

2018年4月10日火曜日

余白をプログラムで動的に設定 [MicrosoftReport]

MicrosoftReportのlocalReport.Renderで帳票作成時に余白をプログラムで動的に設定。

------------------------------------------------------------------
string marginTop = "20.255";
strinf marginLeft = "10.00";

string deviceInfo =
    "<DeviceInfo>" +
    "  <MarginTop>" + marginTop + "cm</MarginTop>" +
    "  <MarginLeft>" + marginLeft + "cm</MarginLeft>" +
    "</DeviceInfo>";

byte[] bytes = localReport.Render("PDF", deviceInfo);
------------------------------------------------------------------

デザインで"本文"のSizeと余白を足しても
"レポート"のPageSizeを超えない用に設定!

2018年3月20日火曜日

範囲SELECTで一部でも重なっているレコードを抽出 [SQL]

SQLで開始と終了の項目があり、SELECTで対象範囲を指定し、
"項目の開始~終了"と"対象範囲"が一部でも重なっているレコードを抽出する場合は、

SELECT * FROM Table
WHERE
(('対象範囲終了' >= '開始項目' AND '対象範囲開始' <= `終了項目`) OR
 ('対象範囲開始' >= `終了項目` AND '対象範囲終了' >= `開始項目`))

で抽出できる。

2018年2月5日月曜日

人名の旧字・異字体・異体字を新漢字に変換 [C#]

-----------------------------------------------------------------------------
class ConvertClass
{
    Dictionary<string, string> KanjiDict = new Dictionary<string, string>();

    public ConvertClass()
    {
        KanjiDict.Add("亞", "亜");
        KanjiDict.Add("惡", "悪");
        KanjiDict.Add("爲", "為");
        KanjiDict.Add("逸", "逸");
        KanjiDict.Add("榮", "栄");
        KanjiDict.Add("衞", "衛");
        KanjiDict.Add("謁", "謁");
        KanjiDict.Add("圓", "円");
        KanjiDict.Add("緣", "縁");
        KanjiDict.Add("薗", "園");
        KanjiDict.Add("應", "応");
        KanjiDict.Add("櫻", "桜");
        KanjiDict.Add("奧", "奥");
        KanjiDict.Add("橫", "横");
        KanjiDict.Add("溫", "温");
        KanjiDict.Add("禍", "禍");
        KanjiDict.Add("價", "価");
        KanjiDict.Add("海", "海");
        KanjiDict.Add("悔", "悔");
        KanjiDict.Add("壞", "壊");
        KanjiDict.Add("懷", "懐");
        KanjiDict.Add("樂", "楽");
        KanjiDict.Add("渴", "渇");
        KanjiDict.Add("卷", "巻");
        KanjiDict.Add("陷", "陥");
        KanjiDict.Add("寬", "寛");
        KanjiDict.Add("漢", "漢");
        KanjiDict.Add("氣", "気");
        KanjiDict.Add("祈", "祈");
        KanjiDict.Add("器", "器");
        KanjiDict.Add("僞", "偽");
        KanjiDict.Add("戲", "戯");
        KanjiDict.Add("虛", "虚");
        KanjiDict.Add("峽", "峡");
        KanjiDict.Add("狹", "狭");
        KanjiDict.Add("響", "響");
        KanjiDict.Add("曉", "暁");
        KanjiDict.Add("勤", "勤");
        KanjiDict.Add("謹", "謹");
        KanjiDict.Add("駈", "駆");
        KanjiDict.Add("勳", "勲");
        KanjiDict.Add("薰", "薫");
        KanjiDict.Add("惠", "恵");
        KanjiDict.Add("揭", "掲");
        KanjiDict.Add("鷄", "鶏");
        KanjiDict.Add("藝", "芸");
        KanjiDict.Add("擊", "撃");
        KanjiDict.Add("縣", "県");
        KanjiDict.Add("儉", "倹");
        KanjiDict.Add("劍", "剣");
        KanjiDict.Add("險", "険");
        KanjiDict.Add("檢", "検");
        KanjiDict.Add("圈", "圏");
        KanjiDict.Add("驗", "験");
        KanjiDict.Add("顯", "顕");
        KanjiDict.Add("嚴", "厳");
        KanjiDict.Add("恆", "恒");
        KanjiDict.Add("黃", "黄");
        KanjiDict.Add("廣", "広");
        KanjiDict.Add("國", "国");
        KanjiDict.Add("黑", "黒");
        KanjiDict.Add("穀", "穀");
        KanjiDict.Add("碎", "砕");
        KanjiDict.Add("雜", "雑");
        KanjiDict.Add("視", "視");
        KanjiDict.Add("兒", "児");
        KanjiDict.Add("濕", "湿");
        KanjiDict.Add("實", "実");
        KanjiDict.Add("社", "社");
        KanjiDict.Add("者", "者");
        KanjiDict.Add("煮", "煮");
        KanjiDict.Add("壽", "寿");
        KanjiDict.Add("收", "収");
        KanjiDict.Add("臭", "臭");
        KanjiDict.Add("從", "従");
        KanjiDict.Add("澁", "渋");
        KanjiDict.Add("縱", "縦");
        KanjiDict.Add("獸", "獣");
        KanjiDict.Add("祝", "祝");
        KanjiDict.Add("暑", "暑");
        KanjiDict.Add("署", "署");
        KanjiDict.Add("緖", "緒");
        KanjiDict.Add("諸", "諸");
        KanjiDict.Add("敍", "叙");
        KanjiDict.Add("將", "将");
        KanjiDict.Add("祥", "祥");
        KanjiDict.Add("涉", "渉");
        KanjiDict.Add("燒", "焼");
        KanjiDict.Add("奬", "奨");
        KanjiDict.Add("條", "条");
        KanjiDict.Add("狀", "状");
        KanjiDict.Add("淨", "浄");
        KanjiDict.Add("乘", "乗");
        KanjiDict.Add("剩", "剰");
        KanjiDict.Add("疊", "畳");
        KanjiDict.Add("孃", "嬢");
        KanjiDict.Add("讓", "譲");
        KanjiDict.Add("釀", "醸");
        KanjiDict.Add("神", "神");
        KanjiDict.Add("眞", "真");
        KanjiDict.Add("寢", "寝");
        KanjiDict.Add("愼", "慎");
        KanjiDict.Add("盡", "尽");
        KanjiDict.Add("粹", "粋");
        KanjiDict.Add("醉", "酔");
        KanjiDict.Add("穗", "穂");
        KanjiDict.Add("瀨", "瀬");
        KanjiDict.Add("齊", "斉");
        KanjiDict.Add("靜", "静");
        KanjiDict.Add("攝", "摂");
        KanjiDict.Add("節", "節");
        KanjiDict.Add("專", "専");
        KanjiDict.Add("戰", "戦");
        KanjiDict.Add("纖", "繊");
        KanjiDict.Add("禪", "禅");
        KanjiDict.Add("祖", "祖");
        KanjiDict.Add("爭", "争");
        KanjiDict.Add("壯", "壮");
        KanjiDict.Add("莊", "荘");
        KanjiDict.Add("搜", "捜");
        KanjiDict.Add("巢", "巣");
        KanjiDict.Add("裝", "装");
        KanjiDict.Add("僧", "僧");
        KanjiDict.Add("層", "層");
        KanjiDict.Add("騷", "騒");
        KanjiDict.Add("增", "増");
        KanjiDict.Add("藏", "蔵");
        KanjiDict.Add("憎", "憎");
        KanjiDict.Add("臟", "臓");
        KanjiDict.Add("贈", "贈");
        KanjiDict.Add("卽", "即");
        KanjiDict.Add("帶", "帯");
        KanjiDict.Add("滯", "滞");
        KanjiDict.Add("瀧", "滝");
        KanjiDict.Add("單", "単");
        KanjiDict.Add("嘆", "嘆");
        KanjiDict.Add("團", "団");
        KanjiDict.Add("彈", "弾");
        KanjiDict.Add("晝", "昼");
        KanjiDict.Add("鑄", "鋳");
        KanjiDict.Add("著", "著");
        KanjiDict.Add("徵", "徴");
        KanjiDict.Add("聽", "聴");
        KanjiDict.Add("懲", "懲");
        KanjiDict.Add("廳", "庁");
        KanjiDict.Add("鎭", "鎮");
        KanjiDict.Add("轉", "転");
        KanjiDict.Add("傳", "伝");
        KanjiDict.Add("都", "都");
        KanjiDict.Add("燈", "灯");
        KanjiDict.Add("盜", "盗");
        KanjiDict.Add("嶋", "島");
        KanjiDict.Add("稻", "稲");
        KanjiDict.Add("德", "徳");
        KanjiDict.Add("突", "突");
        KanjiDict.Add("難", "難");
        KanjiDict.Add("拜", "拝");
        KanjiDict.Add("盃", "杯");
        KanjiDict.Add("梅", "梅");
        KanjiDict.Add("賣", "売");
        KanjiDict.Add("髮", "髪");
        KanjiDict.Add("拔", "抜");
        KanjiDict.Add("繁", "繁");
        KanjiDict.Add("晚", "晩");
        KanjiDict.Add("卑", "卑");
        KanjiDict.Add("祕", "秘");
        KanjiDict.Add("碑", "碑");
        KanjiDict.Add("賓", "賓");
        KanjiDict.Add("敏", "敏");
        KanjiDict.Add("冨", "富");
        KanjiDict.Add("侮", "侮");
        KanjiDict.Add("福", "福");
        KanjiDict.Add("拂", "払");
        KanjiDict.Add("佛", "仏");
        KanjiDict.Add("勉", "勉");
        KanjiDict.Add("步", "歩");
        KanjiDict.Add("峯", "峰");
        KanjiDict.Add("墨", "墨");
        KanjiDict.Add("飜", "翻");
        KanjiDict.Add("每", "毎");
        KanjiDict.Add("萬", "万");
        KanjiDict.Add("默", "黙");
        KanjiDict.Add("埜", "野");
        KanjiDict.Add("藥", "薬");
        KanjiDict.Add("與", "与");
        KanjiDict.Add("搖", "揺");
        KanjiDict.Add("樣", "様");
        KanjiDict.Add("謠", "謡");
        KanjiDict.Add("來", "来");
        KanjiDict.Add("賴", "頼");
        KanjiDict.Add("覽", "覧");
        KanjiDict.Add("欄", "欄");
        KanjiDict.Add("龍", "竜");
        KanjiDict.Add("虜", "虜");
        KanjiDict.Add("凉", "涼");
        KanjiDict.Add("綠", "緑");
        KanjiDict.Add("淚", "涙");
        KanjiDict.Add("壘", "塁");
        KanjiDict.Add("類", "類");
        KanjiDict.Add("禮", "礼");
        KanjiDict.Add("歷", "歴");
        KanjiDict.Add("曆", "暦");
        KanjiDict.Add("練", "練");
        KanjiDict.Add("鍊", "錬");
        KanjiDict.Add("郞", "郎");
        KanjiDict.Add("朗", "朗");
        KanjiDict.Add("廊", "廊");
        KanjiDict.Add("錄", "録");
    }
   
    public string kanziConvert(string moji)
    {
        for (int i = 0; i < moji.Length; i++)
        {
            string moji1 = moji.Substring(i, 1);
            if (KanjiDict.ContainsKey(moji1))
            {
                moji = moji.Replace(moji1, KanjiDict[moji1]);
            }
        }
        return moji;
    }
}
-----------------------------------------------------------------------------

このクラスでほとんどの字は新漢字に変換出来るけど、
C#のstringで文字化けしてしまう拡張文字はこの方法では無理。

𣘺とか𡈽とか𡧃とか𦚰とか・・・。
この辺は結局メモ帳で置換・・・。

2018年2月2日金曜日

pdfの印字位置をプリンターによってズレないように設定 [Windows]

pdfをAdobeReaderで印刷したときにプリンターによって印字位置がズレる。

印刷ダイアログの"ページサイズ処理"が"合わせる"になっていると、
ダイアログ右側の"倍率"がプリンターによって自動で変わってしまう。



"ページサイズ処理"を"実際のサイズ"にすれば印字位置は変わらないのでどのプリンターでも印字位置は変わらなそう。

一度変えれば次からは前回の設定を覚えているみたい。

pdfに設定を埋め込むには"印刷ダイアログプリセット"を設定すれば良いみたいだけど、pdf生成ツールにこれが対応しているのは少なそう・・・。

"印刷ダイアログプリセット"はpdfを開いて
 ファイル>プロパティ>詳細設定
で確認。

他にもページの"拡大/縮小"・"両面印刷モード"・"ページ指定"・"部数"などの設定を埋め込めるみたい。

2018年1月11日木曜日

"エラーを特定できません" リモートデスクトップでエラー [Windows]

Windowsのリモートデスクトップでコピー&ペーストでファイルをコピーしている途中に
別のファイルをコピーしてしまうと、

"エラーを特定できません"

というエラーが出る。

たまに出ていて原因がなかなか分からなかったのだけど、
Ctrl+CはPC使っていると多用するので、このエラーが起きていた。

2017年12月6日水曜日

エラー "debuggable program. No debugger found at:" [Genexus]

Genexusでデバッグをしたら↓のエラーが、

Warning: [PROGRAM] debuggable program. No debugger found at: [PCName]
Description: Connection refused: connect

デバッグができない・・・。

コンパイル結果を削除して全てリビルドし直したらエラーが出なくなった。

今回はjavaなので

Tomcat/webapps/ナレッジ名

のフォルダを削除。

2017年12月2日土曜日

LaravelをWindowsのApacheで動かす [PHP Laravel]

●Apacheのインストール

●PHPのインストール

●php.iniを編集
 ◯php/php.ini-developmentをコピーし、php/php.iniを作成

 ◯extension_dir を設定

 ◯使用するdllのコメントを外す
  extension=php_openssl.dll
  extension=php_pdo_mysql.dll
  など

●Laravelプロジェクトフォルダをサーバーにコピー

●Apacheのconfigフォルダのhttpd.confを編集
 ◯サーバールートやポートの設定
  ServerRoot・Listenを設定
  
 ◯PHPの有効化
  PHPIniDirなどを設定
  
 ◯LaravelProject/public/.htaccess
  をApacheに認識させる
  
  ・LoadModule rewrite_module modules/mod_rewrite.so
   のコメントを外す

  ・DocumentRoot 内の
   AllowOverride None
   ↓
   AllowOverride All

 ◯ドキュメントルートかバーチャルホストを
  Laravelプロジェクトフォルダ内のpublicに設定

   #ドキュメントルートの場合はDocumentRootを設定

   #バーチャルホストの場合は
    Apache/conf/extra/httpd-vhosts.confを↓のように設定
--------------------------------------------------------------
<VirtualHost *:80>
    DocumentRoot "C:/LaravelProject/public"
    ServerName localhost
    <Directory "C:/LaravelProject/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
--------------------------------------------------------------

ぐらいで動いた。
色々と試行錯誤した・・・。

2017年11月16日木曜日

Eloquentのインクリメントとタイムスタンプをデフォルトでなしに [PHP Laravel]

LaravelのEloquentは、
プライマリーキーは"id"のインクリメントで
"created_at"と"updated_at"のタイムスタンプを持っているテーブルになる。
テーブルがこの構成じゃない場合は下記2行をModel毎に追加する。

-----------------------------------------------------
//プライマリーキーはインクリメントではない
public $incrementing = false;
//created_atとupdated_atを使用しない
public $timestamps = false;
-----------------------------------------------------

Model毎に追加するんじゃなくてデフォルトでなしにしたい。

LaravelProject\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php

public $incrementing = true;
があるのでfalseに。

LaravelProject\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasTimestamps.php

public $timestamps = true;
があるのでfalseに。

これでModel毎に追加する必要なし。

2017年11月13日月曜日

Eloquentを使用してDBに一括INSERT [PHP Laravel]

LaravelのEloquentを使用して、DBに一括でINSERT。

//配列を宣言
$User_A = [];

for ($i = 1; $i <= 10; $i++) {
   
    $User_E = new User();

    $User_E->id = $i;
    $User_E->name = "テスト";

    //Modelを配列にし追加
    $User_A[] = $User_E->toArray();
}

//引数に配列を渡し、一括でINSERT
User::insert($User_A);

これで大量のINSERTをする時にちょっとは早くなりそう。

2017年11月9日木曜日

Validationで数値の範囲チェックが範囲内なのにエラー [PHP Laravel]

Validationで数値の範囲チェックが範囲内でもエラーになる・・・。

--------------------------------------------------------------------
        $validator = Validator::make($request->all(), [
            'item'=>'between:2000,3000',
        ]);
--------------------------------------------------------------------

数値チェックを入れたら正常に判定されるようになった。
--------------------------------------------------------------------
        $validator = Validator::make($request->all(), [
            'item'=>'integer|between:2000,3000',
        ]);
--------------------------------------------------------------------

2017年11月8日水曜日

SELECT結果のインスタンスでDBフィールドを入力補完 [PHP Laravel]

LaravelのIDE_Helperを使用し"DB(Model)のフィールドを入力補完"まで行ったら、
Modelクラスをnewした場合は、DBフィールドが入力補完されるけど、SELECT結果のインスタンスでは補完がされない・・・。

Phpstormでは補完されたけど、Eclipseでは補完されず・・・。

どうやらwhereの返り値が何か分からないぽい。
なので、IDE_Helperが生成したアノテーションに1行追加。

/**
  * App\Table
  *
  * @property int $Field1
  * @property string $Field2
  * @method static \Illuminate\Database\Eloquent\Builder|\App\Table whereField1($value)
  * @method static \Illuminate\Database\Eloquent\Builder|\App\Table whereField2($value)
  * @method static \Illuminate\Database\Eloquent\Builder|\App\Table where($value) //***追加行***
  * @mixin \Eloquent
  */

これでwhereの返り値が判定でき、補完されるように!

where以外が最後の場合はまたそのメソッドをアノテーションに追加しなきゃだけど・・・

もっといい方法あるのかな??

2017年11月5日日曜日

DB(Model)のフィールドを入力補完 [PHP Laravel]

LaravelのEloquentを使ってみたけどDBフィールドをエディターが入力補完してくれない。

ってことで、補完用の機能を追加してくれる"laravel-ide-helper"を導入。

◯プロジェクトフォルダに移動してコンポーサーでダウンロード
composer require barryvdh/laravel-ide-helper

◯phpにダウンロードしたファイルの読み込み宣言
LaravelProject/config/app.phpファイルの'providers'に
   
  Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,

を追加

◯インストール
composer require --dev barryvdh/laravel-ide-helper

◯補完用のファイルの生成
php artisan ide-helper:generate

→LaravelProject\_ide_helper.php
 が出来る。

◯DB補完用ファイルの生成機能を追加
composer require doctrine/dbal

◯DB補完用ファイルの生成
php artisan ide-helper:models

→LaravelProject\app の下にあるModelファイルに補完用コメントが追加される。

/**
 * App\Table
 *
 * @property int $Field1
 * @property string $Field2
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Table whereField1($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Table whereField2($value)
 * @mixin \Eloquent
 */

このコメントを認識してくれるIDE・エディターなら補完してくれる。

2017年10月23日月曜日

aspxファイルのコピーして作成したら前のクラス名に戻る [ASP.net]

C#のaspxファイルをコピーして新しい画面を作成したときに、
ファイル名とクラス名を新しい名前に変更し保存したりすると、何故かクラス名が前の名前に戻ってしまう・・・

htmlソースの一番上の行にフォル名とクラス名持ってた。

<%@ Page Title="" Language="C#" MasterPageFile="" AutoEventWireup="true" CodeBehind="[FileName].aspx.cs" Inherits="[NameSpace].[ClassName]" %>

ここも新しい名前に修正したら戻らなくなった。

2017年9月29日金曜日

ローカル レポートの処理中にエラーが発生しました。[MicrosoftReport]

"ローカル レポートの処理中にエラーが発生しました。"

Microsoftレポートのエラーは何でもこのエラーだから原因が分かり辛い・・・。

レポートのどの部分でエラーが発生しているか調べるために、
デザインの項目を削除しながら実行してエラー箇所を特定。

一番多い原因はレポートに設定している変数名が
流し込んでいるデータになかったり、
データ型が違ったり。

デザイン項目の一括削除は範囲選択して右クリックの削除!

2017年9月17日日曜日

SQLで最大値の行のみをJOIN [SQL]

開始日で履歴を保持している商品マスタをLEFT JOINしたい場合。

ShohinT(商品マスタ)
| ShohinCD | YYMMDD |

SELECT *
FROM UriageT
LEFT JOIN  ShohinT
ON UriageT.ShohinCD = ShohinT.ShohinCD
AND ShohinT.YYMMDD =
    (SELECT MAX(ShohinT.YYMMDD) AS F1
    FROM ShohinT AS S2
    WHERE S2.ShohinCD = UriageT.ShohinCD
    AND S2.YYMMDD <= UriageT.YYMMDD)

売上テーブルの売上日(UriageT.YYMMDD)以前で最大日の商品マスタをJOIN。ONの中でサブクエリを書けばできた。

SQLServerでもMySQLでも同じそう。