[导入]我看OO的哲学

本文探讨了面向对象(OO)技术与哲学的关系,并提出OO技术已足够成熟,无需过多哲学包装。文章强调继承作为推理技术和接口作为正交分解技术的重要性,并尝试从数学角度为OO技术奠定基础。

http://spaces.msn.com/members/zbw25/Blog/cns!1pA6-3FOo9yNp_4lmEHxdDqA!248.entry

     物理和数学的新分支的产生多半有着哲理性的开端,而软件中OO技术的兴起想必也是有一定的哲学基础的。但哲学是一种整体的,超越的认识,当我们在实际的应 用中走得越远,就会发现现实的操作距离哲学的理想越远。早期面向对象总是鼓吹对现实世界的直接表达,鼓吹Object,Class的本体论含义。但现在我 们已经可以清楚的感觉到面向对象的哲学隐喻存在着本质上的困难,而软件希望作为真实世界的翻版也必然面临着建模的本质性问题,即任何一个单一的模型与事实 相比总是简化的,贫瘠的。通过无限多自恰的模型构成的概念包络,再加上无法用技术手段表达的哲学升华,我们才达到了所谓不随人的意志转移的客观世界。软件 只能是客观世界的一部分,而不可能是客观世界的镜像。
    OO技术已经得到了深刻的发展与应用,实际上现在可以不再总是需要一件哲学的外衣了。我一直强调继承(inheritance)是一种推理技术,而接口 (interface)是一种正交分解技术, 希望抛开OO的诠释而从数学上为OO技术找到根基。 无论是推理还是正交分解,我们都可以在数学上严格的证明它们的好处, 因此OO必然是一种好的技术。至于它对现实世界的表达能力,那是另外一个独立的问题。我的这种思想深受测度论(measure theory)的影响。测度论中对于概率的定义是纯粹数学化,满足一定条件的数学量就定义为概率。 至于它是否对应于我们日常思维中的概率概念,那是使用者的责任,那是物理学所面临的问题。只有通过这种公理化的定义,测度论才摆脱了概念完备性与自恰性的 问题,才摆脱了哲学上的循环论证。当然,诠释问题在物理学中仍然是一个非常严重的问题, 例如对于量子力学的Copenhagen诠释的争论从未间断过,只是对于数学层面上的操作过程一般还能保持共识。当然,说的深入一些,即使数学上的定义也 未必是逻辑上必然的。为什么实数轴是完备的,为什么1.999999999...的极限是2, 这实际上是一个公理: 选择公理(axiom of Choice), 等价于Zorn引理。
<think>好的,我现在需要帮助用户在SAP中使用OOALV(面向对象的ALV)实现打开并导入本地文件的功能。首先,我需要回顾用户之前的问题和我的回答,确保一致性。用户之前询问过如何在SAP中导入本地文件,我提到了使用GUI_UPLOAD、OLE Automation以及ALSM_EXCEL等方法。现在用户希望结合OOALV来实现,也就是在面向对象的ALV报表中整合文件导入功能。 首先,我得理解用户的需求。OOALV通常指使用CL_SALV_TABLE等类来创建ALV报表,用户希望在这个报表界面中添加一个按钮或菜单,允许用户选择本地文件并导入数据,然后在ALV中显示。这可能涉及到创建自定义屏幕、添加按钮事件处理,以及将文件数据转换为内部表后绑定到ALV。 接下来,我需要考虑如何将之前的文件导入方法与OOALV结合。例如,使用CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD来读取文件,然后将数据填充到内部表,最后通过CL_SALV_TABLE显示。同时,用户可能需要处理不同文件格式,比如Excel或CSV,需要选择合适的函数模块或类。 还需要注意OOALV的事件处理,比如添加一个工具栏按钮触发文件选择对话框。这里可能需要创建自定义容器,或者使用CL_SALV_EVENTS_TABLE来处理用户交互。另外,异常处理和用户提示也很重要,比如文件读取失败时的消息提示。 然后,参考用户提供的站内引用,其中提到了CL_SALV_GUI_TABLE_IDA类,支持CDS View和透明表。虽然这可能不是直接相关,但可以思考是否在导入数据后利用IDA模型来增强ALV的功能,比如筛选或聚合数据。不过用户的主要需求是导入和显示,所以可能需要更基础的OOALV实现。 此外,用户提到的IDOC配置(如Y_IDOC_PO_PROCESS)可能不直接相关,但如果有数据需要通过IDOC处理,可能需要将导入的数据转换为IDOC结构。但当前问题集中在界面操作,所以暂时可以忽略这部分。 现在,我需要构建一个分步骤的示例,包括创建ALV报表、添加文件导入按钮、处理文件选择、读取数据并刷新ALV显示。可能需要使用CL_GUI_CUSTOM_CONTAINER创建容器,CL_SALV_TABLE生成ALV实例,并为工具栏添加自定义按钮。按钮的事件处理中调用文件对话框,读取文件内容,转换到内部表,最后刷新ALV的数据。 同时,需要考虑字符编码问题,特别是用户上传的文件可能有不同的编码格式,如UTF-8或ANSI,需要在GUI_UPLOAD中正确指定。另外,大文件的分块处理可能需要优化,但基础示例可能不需要。 最后,验证示例代码的正确性,确保语法正确,特别是ABAP OO的语法,如方法的调用、事件处理等。此外,提供相关问题,帮助用户进一步扩展功能,比如数据校验、错误处理或性能优化。</think>在SAP系统中通过OOALV实现本地文件导入功能,需结合CL_SALV_TABLE与文件操作类。以下是实现该需求的完整技术方案: ### 一、创建带文件导入功能的ALV容器 ```abap CLASS lcl_controller DEFINITION. PUBLIC SECTION. METHODS: constructor, display_alv, on_file_import FOR EVENT added_function OF cl_salv_events_table. PRIVATE SECTION. DATA: o_alv TYPE REF TO cl_salv_table, o_container TYPE REF TO cl_gui_custom_container, gt_data TYPE TABLE OF sflight. ENDCLASS. CLASS lcl_controller IMPLEMENTATION. METHOD constructor. " 创建容器对象 CREATE OBJECT o_container EXPORTING container_name = 'CC_ALV'. " 初始化ALV cl_salv_table=>factory( EXPORTING r_container = o_container IMPORTING r_salv_table = o_alv CHANGING t_table = gt_data ). " 添加自定义工具栏按钮 DATA(lo_functions) = o_alv->get_functions( ). lo_functions->add_function( name = 'FILE_IMPORT' icon = CONV #( icon_import ) tooltip = '导入本地文件' position = if_salv_c_function_position=>right_of_salv_functions ). " 注册事件处理 DATA(lo_events) = o_alv->get_event( ). SET HANDLER on_file_import FOR lo_events. ENDMETHOD. ``` ### 二、实现文件导入事件处理 ```abap METHOD on_file_import. DATA: lt_file_content TYPE TABLE OF string, lv_filename TYPE string. " 调用文件选择对话框 cl_gui_frontend_services=>file_open_dialog( EXPORTING window_title = '选择文件' file_filter = 'CSV (*.csv)|*.csv|Excel (*.xlsx)|*.xlsx' CHANGING file_table = DATA(lt_file_table) rc = DATA(lv_rc) ). IF lv_rc = 1. lv_filename = lt_file_table[ 1 ]-filename. " 根据文件类型选择读取方式 CASE lt_file_table[ 1 ]-file_extension. WHEN 'CSV'. cl_gui_frontend_services=>gui_upload( EXPORTING filename = lv_filename filetype = 'ASC' CHANGING data_tab = lt_file_content ). " 解析CSV数据 LOOP AT lt_file_content ASSIGNING FIELD-SYMBOL(<line>). SPLIT <line> AT ',' INTO DATA(ls_data)-carrid DATA(ls_data)-connid DATA(ls_data)-fldate. APPEND ls_data TO gt_data. ENDLOOP. WHEN 'XLSX'. " 使用ALSM_EXCEL处理Excel文件 CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = lv_filename i_begin_col = 1 i_begin_row = 2 TABLES intern = lt_file_content EXCEPTIONS inconsistent_parameters = 1. ENDCASE. " 刷新ALV显示 o_alv->refresh( ). ENDIF. ENDMETHOD. ``` ### 三、启动ALV显示 ```abap METHOD display_alv. " 设置列优化显示 o_alv->get_columns( )->set_optimize( abap_true ). " 显示ALV o_alv->display( ). ENDMETHOD. ``` ### 四、调用入口 ```abap START-OF-SELECTION. DATA(lo_controller) = NEW lcl_controller( ). lo_controller->display_alv( ). ``` $$关键配置点: 1. 事务码SE24需激活CL_SALV_TABLE类 2. 屏幕容器CC_ALV需在屏幕绘制器中定义 3. 使用CL_GUI_FRONTEND_SERVICES需要GUI状态为ACTIVE[^3]$$ **技术要点**: 1. 通过`cl_salv_table=>factory`创建ALV实例时绑定自定义容器 2. 使用`add_function`方法扩展ALV工具栏 3. 事件处理中集成`CL_GUI_FRONTEND_SERVICES`文件操作 4. 支持多种文件格式的智能识别与解析 --相关问题--: 1. 如何实现文件导入时的数据有效性校验? 2. 怎样处理超大文件的分批导入? 3. 如何将导入数据直接写入数据库表?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值